Skip to content

Commit b50800b

Browse files
committed
Fix #120
1 parent 2dba609 commit b50800b

File tree

9 files changed

+94
-5
lines changed

9 files changed

+94
-5
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

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
};

test/TodayTests.cpp

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1495,3 +1495,32 @@ TEST_F(TodayServiceCase, SubscribeUnsubscribeNotificationsDeferred)
14951495
FAIL() << response::toJSON(ex.getErrors());
14961496
}
14971497
}
1498+
1499+
TEST_F(TodayServiceCase, MutateSetFloat)
1500+
{
1501+
auto query = R"(mutation {
1502+
setFloat(value: 0.1)
1503+
})"_graphql;
1504+
response::Value variables(response::Type::Map);
1505+
auto state = std::make_shared<today::RequestState>(22);
1506+
auto result = _service->resolve(state, query, "", std::move(variables)).get();
1507+
1508+
try
1509+
{
1510+
ASSERT_TRUE(result.type() == response::Type::Map);
1511+
auto errorsItr = result.find("errors");
1512+
if (errorsItr != result.get<response::MapType>().cend())
1513+
{
1514+
FAIL() << response::toJSON(response::Value(errorsItr->second));
1515+
}
1516+
const auto data = service::ScalarArgument::require("data", result);
1517+
ASSERT_TRUE(data.type() == response::Type::Map);
1518+
const auto setFloat = service::FloatArgument::require("setFloat", data);
1519+
ASSERT_EQ(0.1, setFloat) << "should return the value that was set";
1520+
ASSERT_EQ(0.1, today::Mutation::getFloat()) << "should save the value in the Mutation static member";
1521+
}
1522+
catch (service::schema_exception & ex)
1523+
{
1524+
FAIL() << response::toJSON(ex.getErrors());
1525+
}
1526+
}

0 commit comments

Comments
 (0)