Skip to content

Commit 8ad4a17

Browse files
authored
Merge pull request #122 from wravery/float-input-values
Float input values
2 parents 2dba609 + ae46e79 commit 8ad4a17

File tree

12 files changed

+162
-64
lines changed

12 files changed

+162
-64
lines changed

include/graphqlservice/GraphQLGrammar.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -366,8 +366,8 @@ struct input_value_content
366366
: sor<list_value
367367
, object_value
368368
, variable_value
369-
, integer_value
370369
, float_value
370+
, integer_value
371371
, string_value
372372
, bool_value
373373
, null_keyword

include/graphqlservice/GraphQLResponse.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ struct Value
125125
GRAPHQLRESPONSE_EXPORT explicit Value(const Value& other);
126126

127127
GRAPHQLRESPONSE_EXPORT Value& operator=(Value&& rhs) noexcept;
128-
GRAPHQLRESPONSE_EXPORT Value& operator=(const Value& rhs) = delete;
128+
Value& operator=(const Value& rhs) = delete;
129129

130130
// Comparison
131131
GRAPHQLRESPONSE_EXPORT bool operator==(const Value& rhs) const noexcept;

samples/schema.today.graphql

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@ type CompleteTaskPayload {
8787

8888
type Mutation {
8989
completeTask(input: CompleteTaskInput!) : CompleteTaskPayload!
90+
setFloat(value: Float!): Float!
9091
}
9192

9293
type Subscription {

samples/separate/MutationObject.cpp

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,8 @@ Mutation::Mutation()
2121
"Mutation"
2222
}, {
2323
{ R"gql(__typename)gql"sv, [this](service::ResolverParams&& params) { return resolve_typename(std::move(params)); } },
24-
{ R"gql(completeTask)gql"sv, [this](service::ResolverParams&& params) { return resolveCompleteTask(std::move(params)); } }
24+
{ R"gql(completeTask)gql"sv, [this](service::ResolverParams&& params) { return resolveCompleteTask(std::move(params)); } },
25+
{ R"gql(setFloat)gql"sv, [this](service::ResolverParams&& params) { return resolveSetFloat(std::move(params)); } }
2526
})
2627
{
2728
}
@@ -41,6 +42,21 @@ std::future<response::Value> Mutation::resolveCompleteTask(service::ResolverPara
4142
return service::ModifiedResult<CompleteTaskPayload>::convert(std::move(result), std::move(params));
4243
}
4344

45+
service::FieldResult<response::FloatType> Mutation::applySetFloat(service::FieldParams&&, response::FloatType&&) const
46+
{
47+
throw std::runtime_error(R"ex(Mutation::applySetFloat is not implemented)ex");
48+
}
49+
50+
std::future<response::Value> Mutation::resolveSetFloat(service::ResolverParams&& params)
51+
{
52+
auto argValue = service::ModifiedArgument<response::FloatType>::require("value", params.arguments);
53+
std::unique_lock resolverLock(_resolverMutex);
54+
auto result = applySetFloat(service::FieldParams(params, std::move(params.fieldDirectives)), std::move(argValue));
55+
resolverLock.unlock();
56+
57+
return service::ModifiedResult<response::FloatType>::convert(std::move(result), std::move(params));
58+
}
59+
4460
std::future<response::Value> Mutation::resolve_typename(service::ResolverParams&& params)
4561
{
4662
return service::ModifiedResult<response::StringType>::convert(response::StringType{ R"gql(Mutation)gql" }, std::move(params));
@@ -53,7 +69,10 @@ void AddMutationDetails(std::shared_ptr<introspection::ObjectType> typeMutation,
5369
typeMutation->AddFields({
5470
std::make_shared<introspection::Field>("completeTask", R"md()md", std::nullopt, std::vector<std::shared_ptr<introspection::InputValue>>({
5571
std::make_shared<introspection::InputValue>("input", R"md()md", schema->WrapType(introspection::TypeKind::NON_NULL, schema->LookupType("CompleteTaskInput")), R"gql()gql")
56-
}), schema->WrapType(introspection::TypeKind::NON_NULL, schema->LookupType("CompleteTaskPayload")))
72+
}), schema->WrapType(introspection::TypeKind::NON_NULL, schema->LookupType("CompleteTaskPayload"))),
73+
std::make_shared<introspection::Field>("setFloat", R"md()md", std::nullopt, std::vector<std::shared_ptr<introspection::InputValue>>({
74+
std::make_shared<introspection::InputValue>("value", R"md()md", schema->WrapType(introspection::TypeKind::NON_NULL, schema->LookupType("Float")), R"gql()gql")
75+
}), schema->WrapType(introspection::TypeKind::NON_NULL, schema->LookupType("Float")))
5776
});
5877
}
5978

samples/separate/MutationObject.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,11 @@ class Mutation
1818

1919
public:
2020
virtual service::FieldResult<std::shared_ptr<CompleteTaskPayload>> applyCompleteTask(service::FieldParams&& params, CompleteTaskInput&& inputArg) const;
21+
virtual service::FieldResult<response::FloatType> applySetFloat(service::FieldParams&& params, response::FloatType&& valueArg) const;
2122

2223
private:
2324
std::future<response::Value> resolveCompleteTask(service::ResolverParams&& params);
25+
std::future<response::Value> resolveSetFloat(service::ResolverParams&& params);
2426

2527
std::future<response::Value> resolve_typename(service::ResolverParams&& params);
2628
};

samples/today/TodayMock.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -394,6 +394,19 @@ service::FieldResult<std::shared_ptr<object::CompleteTaskPayload>> Mutation::app
394394
return promise.get_future();
395395
}
396396

397+
std::optional<response::FloatType> Mutation::_setFloat = std::nullopt;
398+
399+
double Mutation::getFloat() noexcept
400+
{
401+
return *_setFloat;
402+
}
403+
404+
service::FieldResult<response::FloatType> Mutation::applySetFloat(service::FieldParams&& params, response::FloatType&& valueArg) const
405+
{
406+
_setFloat = std::make_optional(valueArg);
407+
return valueArg;
408+
}
409+
397410
std::stack<CapturedParams> NestedType::_capturedParams;
398411

399412
NestedType::NestedType(service::FieldParams&& params, int depth)

samples/today/TodayMock.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -402,10 +402,14 @@ class Mutation : public object::Mutation
402402

403403
explicit Mutation(completeTaskMutation&& mutateCompleteTask);
404404

405+
static double getFloat() noexcept;
406+
405407
service::FieldResult<std::shared_ptr<object::CompleteTaskPayload>> applyCompleteTask(service::FieldParams&& params, CompleteTaskInput&& input) const final;
408+
service::FieldResult<response::FloatType> applySetFloat(service::FieldParams&& params, response::FloatType&& valueArg) const final;
406409

407410
private:
408411
completeTaskMutation _mutateCompleteTask;
412+
static std::optional<response::FloatType> _setFloat;
409413
};
410414

411415
class Subscription : public object::Subscription

samples/unified/TodaySchema.cpp

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -667,7 +667,8 @@ Mutation::Mutation()
667667
"Mutation"
668668
}, {
669669
{ R"gql(__typename)gql"sv, [this](service::ResolverParams&& params) { return resolve_typename(std::move(params)); } },
670-
{ R"gql(completeTask)gql"sv, [this](service::ResolverParams&& params) { return resolveCompleteTask(std::move(params)); } }
670+
{ R"gql(completeTask)gql"sv, [this](service::ResolverParams&& params) { return resolveCompleteTask(std::move(params)); } },
671+
{ R"gql(setFloat)gql"sv, [this](service::ResolverParams&& params) { return resolveSetFloat(std::move(params)); } }
671672
})
672673
{
673674
}
@@ -687,6 +688,21 @@ std::future<response::Value> Mutation::resolveCompleteTask(service::ResolverPara
687688
return service::ModifiedResult<CompleteTaskPayload>::convert(std::move(result), std::move(params));
688689
}
689690

691+
service::FieldResult<response::FloatType> Mutation::applySetFloat(service::FieldParams&&, response::FloatType&&) const
692+
{
693+
throw std::runtime_error(R"ex(Mutation::applySetFloat is not implemented)ex");
694+
}
695+
696+
std::future<response::Value> Mutation::resolveSetFloat(service::ResolverParams&& params)
697+
{
698+
auto argValue = service::ModifiedArgument<response::FloatType>::require("value", params.arguments);
699+
std::unique_lock resolverLock(_resolverMutex);
700+
auto result = applySetFloat(service::FieldParams(params, std::move(params.fieldDirectives)), std::move(argValue));
701+
resolverLock.unlock();
702+
703+
return service::ModifiedResult<response::FloatType>::convert(std::move(result), std::move(params));
704+
}
705+
690706
std::future<response::Value> Mutation::resolve_typename(service::ResolverParams&& params)
691707
{
692708
return service::ModifiedResult<response::StringType>::convert(response::StringType{ R"gql(Mutation)gql" }, std::move(params));
@@ -1160,7 +1176,10 @@ void AddTypesToSchema(const std::shared_ptr<introspection::Schema>& schema)
11601176
typeMutation->AddFields({
11611177
std::make_shared<introspection::Field>("completeTask", R"md()md", std::nullopt, std::vector<std::shared_ptr<introspection::InputValue>>({
11621178
std::make_shared<introspection::InputValue>("input", R"md()md", schema->WrapType(introspection::TypeKind::NON_NULL, schema->LookupType("CompleteTaskInput")), R"gql()gql")
1163-
}), schema->WrapType(introspection::TypeKind::NON_NULL, schema->LookupType("CompleteTaskPayload")))
1179+
}), schema->WrapType(introspection::TypeKind::NON_NULL, schema->LookupType("CompleteTaskPayload"))),
1180+
std::make_shared<introspection::Field>("setFloat", R"md()md", std::nullopt, std::vector<std::shared_ptr<introspection::InputValue>>({
1181+
std::make_shared<introspection::InputValue>("value", R"md()md", schema->WrapType(introspection::TypeKind::NON_NULL, schema->LookupType("Float")), R"gql()gql")
1182+
}), schema->WrapType(introspection::TypeKind::NON_NULL, schema->LookupType("Float")))
11641183
});
11651184
typeSubscription->AddFields({
11661185
std::make_shared<introspection::Field>("nextAppointmentChange", R"md()md", std::make_optional<response::StringType>(R"md(Need to deprecate a [field](https://facebook.github.io/graphql/June2018/#sec-Deprecation))md"), std::vector<std::shared_ptr<introspection::InputValue>>(), schema->LookupType("Appointment")),

samples/unified/TodaySchema.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -245,9 +245,11 @@ class Mutation
245245

246246
public:
247247
virtual service::FieldResult<std::shared_ptr<CompleteTaskPayload>> applyCompleteTask(service::FieldParams&& params, CompleteTaskInput&& inputArg) const;
248+
virtual service::FieldResult<response::FloatType> applySetFloat(service::FieldParams&& params, response::FloatType&& valueArg) const;
248249

249250
private:
250251
std::future<response::Value> resolveCompleteTask(service::ResolverParams&& params);
252+
std::future<response::Value> resolveSetFloat(service::ResolverParams&& params);
251253

252254
std::future<response::Value> resolve_typename(service::ResolverParams&& params);
253255
};

src/GraphQLResponse.cpp

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -363,12 +363,20 @@ void Value::set<BooleanType>(BooleanType value)
363363
template <>
364364
void Value::set<IntType>(IntType value)
365365
{
366-
if (type() != Type::Int)
366+
if (type() == Type::Float)
367367
{
368-
throw std::logic_error("Invalid call to Value::set for IntType");
368+
// Coerce IntType to FloatType
369+
*_data = { static_cast<FloatType>(value) };
369370
}
371+
else
372+
{
373+
if (type() != Type::Int)
374+
{
375+
throw std::logic_error("Invalid call to Value::set for IntType");
376+
}
370377

371-
*_data = { value };
378+
*_data = { value };
379+
}
372380
}
373381

374382
template <>
@@ -452,6 +460,12 @@ IntType Value::get<IntType>() const
452460
template <>
453461
FloatType Value::get<FloatType>() const
454462
{
463+
if (type() == Type::Int)
464+
{
465+
// Coerce IntType to FloatType
466+
return static_cast<FloatType>(std::get<IntType>(*_data));
467+
}
468+
455469
if (type() != Type::Float)
456470
{
457471
throw std::logic_error("Invalid call to Value::get for FloatType");

0 commit comments

Comments
 (0)