Skip to content

Commit 566cd2f

Browse files
authored
Merge pull request #214 from wravery/bugfixes
Fixes for #208 and #209
2 parents eef8bcc + fb92902 commit 566cd2f

File tree

16 files changed

+290
-63
lines changed

16 files changed

+290
-63
lines changed

include/SchemaLoader.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,6 @@ struct OutputField
154154
{
155155
std::string_view type;
156156
std::string_view name;
157-
std::string_view cppName;
158157
InputFieldList arguments;
159158
OutputFieldType fieldType = OutputFieldType::Builtin;
160159
TypeModifierStack modifiers;
@@ -263,6 +262,9 @@ class SchemaLoader
263262
std::string getInputCppType(const InputField& field) const noexcept;
264263
std::string getOutputCppType(const OutputField& field) const noexcept;
265264

265+
static std::string getOutputCppAccessor(const OutputField& field) noexcept;
266+
static std::string getOutputCppResolver(const OutputField& field) noexcept;
267+
266268
private:
267269
static bool isExtension(const peg::ast_node& definition) noexcept;
268270

@@ -303,6 +305,8 @@ class SchemaLoader
303305
void validateTransitiveInterfaces(
304306
std::string_view typeName, const std::vector<std::string_view>& interfaces) const;
305307

308+
static std::string getJoinedCppName(std::string_view prefix, std::string_view fieldName) noexcept;
309+
306310
static const std::string_view s_introspectionNamespace;
307311
static const BuiltinTypeMap s_builtinTypes;
308312
static const CppTypeMap s_builtinCppTypes;

include/graphqlservice/GraphQLService.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
#include "graphqlservice/internal/Version.h"
2727

2828
#include <chrono>
29+
#include <condition_variable>
2930
#include <functional>
3031
#include <future>
3132
#include <list>
@@ -37,6 +38,7 @@
3738
#include <stdexcept>
3839
#include <string>
3940
#include <string_view>
41+
#include <thread>
4042
#include <tuple>
4143
#include <type_traits>
4244
#include <variant>

samples/client/query/QueryClient.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -404,6 +404,9 @@ const std::string& GetRequestText() noexcept
404404
isNow
405405
}
406406
}
407+
408+
# Try a field with a C++ keyword
409+
default
407410
}
408411
)gql"s;
409412

@@ -459,6 +462,11 @@ Response parseResponse(response::Value response)
459462
result.anyType = ModifiedResponse<Response::anyType_UnionType>::parse<TypeModifier::List, TypeModifier::Nullable>(std::move(member.second));
460463
continue;
461464
}
465+
if (member.first == R"js(default)js"sv)
466+
{
467+
result.default_ = ModifiedResponse<std::string>::parse<TypeModifier::Nullable>(std::move(member.second));
468+
continue;
469+
}
462470
}
463471
}
464472

samples/client/query/QueryClient.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,9 @@ static_assert(graphql::internal::MinorVersion == 1, "regenerate with clientgen:
8383
/// isNow
8484
/// }
8585
/// }
86+
///
87+
/// # Try a field with a C++ keyword
88+
/// default
8689
/// }
8790
/// </code>
8891
namespace graphql::client::query::Query {
@@ -174,6 +177,7 @@ struct Response
174177
unreadCounts_FolderConnection unreadCounts {};
175178
TaskState testTaskState {};
176179
std::vector<std::optional<anyType_UnionType>> anyType {};
180+
std::optional<std::string> default_ {};
177181
};
178182

179183
Response parseResponse(response::Value response);

samples/client/query/query.today.graphql

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,4 +55,7 @@ query {
5555
isNow
5656
}
5757
}
58+
59+
# Try a field with a C++ keyword
60+
default
5861
}

samples/today/TodayMock.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -569,6 +569,11 @@ std::vector<std::shared_ptr<object::UnionType>> Query::getAnyType(
569569
return result;
570570
}
571571

572+
std::optional<std::string> Query::getDefault() const noexcept
573+
{
574+
return std::nullopt;
575+
}
576+
572577
Mutation::Mutation(completeTaskMutation&& mutateCompleteTask)
573578
: _mutateCompleteTask(std::move(mutateCompleteTask))
574579
{

samples/today/TodayMock.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,7 @@ class Query : public std::enable_shared_from_this<Query>
9999
TaskState getTestTaskState();
100100
std::vector<std::shared_ptr<object::UnionType>> getAnyType(
101101
const service::FieldParams& params, const std::vector<response::IdType>& ids);
102+
std::optional<std::string> getDefault() const noexcept;
102103

103104
private:
104105
std::shared_ptr<Appointment> findAppointment(

samples/today/nointrospection/QueryObject.cpp

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ service::ResolverMap Query::getResolvers() const noexcept
5050
{ R"gql(tasks)gql"sv, [this](service::ResolverParams&& params) { return resolveTasks(std::move(params)); } },
5151
{ R"gql(nested)gql"sv, [this](service::ResolverParams&& params) { return resolveNested(std::move(params)); } },
5252
{ R"gql(anyType)gql"sv, [this](service::ResolverParams&& params) { return resolveAnyType(std::move(params)); } },
53+
{ R"gql(default)gql"sv, [this](service::ResolverParams&& params) { return resolveDefault(std::move(params)); } },
5354
{ R"gql(expensive)gql"sv, [this](service::ResolverParams&& params) { return resolveExpensive(std::move(params)); } },
5455
{ R"gql(tasksById)gql"sv, [this](service::ResolverParams&& params) { return resolveTasksById(std::move(params)); } },
5556
{ R"gql(__typename)gql"sv, [this](service::ResolverParams&& params) { return resolve_typename(std::move(params)); } },
@@ -231,6 +232,16 @@ service::AwaitableResolver Query::resolveAnyType(service::ResolverParams&& param
231232
return service::ModifiedResult<UnionType>::convert<service::TypeModifier::List, service::TypeModifier::Nullable>(std::move(result), std::move(params));
232233
}
233234

235+
service::AwaitableResolver Query::resolveDefault(service::ResolverParams&& params) const
236+
{
237+
std::unique_lock resolverLock(_resolverMutex);
238+
auto directives = std::move(params.fieldDirectives);
239+
auto result = _pimpl->getDefault(service::FieldParams(service::SelectionSetParams{ params }, std::move(directives)));
240+
resolverLock.unlock();
241+
242+
return service::ModifiedResult<std::string>::convert<service::TypeModifier::Nullable>(std::move(result), std::move(params));
243+
}
244+
234245
service::AwaitableResolver Query::resolve_typename(service::ResolverParams&& params) const
235246
{
236247
return service::ModifiedResult<std::string>::convert(std::string{ R"gql(Query)gql" }, std::move(params));
@@ -277,7 +288,8 @@ void AddQueryDetails(const std::shared_ptr<schema::ObjectType>& typeQuery, const
277288
schema::Field::Make(R"gql(testTaskState)gql"sv, R"md()md"sv, std::nullopt, schema->WrapType(introspection::TypeKind::NON_NULL, schema->LookupType(R"gql(TaskState)gql"sv))),
278289
schema::Field::Make(R"gql(anyType)gql"sv, R"md()md"sv, std::nullopt, schema->WrapType(introspection::TypeKind::NON_NULL, schema->WrapType(introspection::TypeKind::LIST, schema->LookupType(R"gql(UnionType)gql"sv))), {
279290
schema::InputValue::Make(R"gql(ids)gql"sv, R"md()md"sv, schema->WrapType(introspection::TypeKind::NON_NULL, schema->WrapType(introspection::TypeKind::LIST, schema->WrapType(introspection::TypeKind::NON_NULL, schema->LookupType(R"gql(ID)gql"sv)))), R"gql()gql"sv)
280-
})
291+
}),
292+
schema::Field::Make(R"gql(default)gql"sv, R"md()md"sv, std::nullopt, schema->LookupType(R"gql(String)gql"sv))
281293
});
282294
}
283295

samples/today/nointrospection/QueryObject.h

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,18 @@ concept getAnyType = requires (TImpl impl, std::vector<response::IdType> idsArg)
157157
{ service::AwaitableObject<std::vector<std::shared_ptr<UnionType>>> { impl.getAnyType(std::move(idsArg)) } };
158158
};
159159

160+
template <class TImpl>
161+
concept getDefaultWithParams = requires (TImpl impl, service::FieldParams params)
162+
{
163+
{ service::AwaitableScalar<std::optional<std::string>> { impl.getDefault(std::move(params)) } };
164+
};
165+
166+
template <class TImpl>
167+
concept getDefault = requires (TImpl impl)
168+
{
169+
{ service::AwaitableScalar<std::optional<std::string>> { impl.getDefault() } };
170+
};
171+
160172
template <class TImpl>
161173
concept beginSelectionSet = requires (TImpl impl, const service::SelectionSetParams params)
162174
{
@@ -187,6 +199,7 @@ class Query final
187199
service::AwaitableResolver resolveExpensive(service::ResolverParams&& params) const;
188200
service::AwaitableResolver resolveTestTaskState(service::ResolverParams&& params) const;
189201
service::AwaitableResolver resolveAnyType(service::ResolverParams&& params) const;
202+
service::AwaitableResolver resolveDefault(service::ResolverParams&& params) const;
190203

191204
service::AwaitableResolver resolve_typename(service::ResolverParams&& params) const;
192205

@@ -209,6 +222,7 @@ class Query final
209222
virtual service::AwaitableObject<std::vector<std::shared_ptr<Expensive>>> getExpensive(service::FieldParams&& params) const = 0;
210223
virtual service::AwaitableScalar<TaskState> getTestTaskState(service::FieldParams&& params) const = 0;
211224
virtual service::AwaitableObject<std::vector<std::shared_ptr<UnionType>>> getAnyType(service::FieldParams&& params, std::vector<response::IdType>&& idsArg) const = 0;
225+
virtual service::AwaitableScalar<std::optional<std::string>> getDefault(service::FieldParams&& params) const = 0;
212226
};
213227

214228
template <class T>
@@ -412,6 +426,22 @@ class Query final
412426
}
413427
}
414428

429+
service::AwaitableScalar<std::optional<std::string>> getDefault(service::FieldParams&& params) const final
430+
{
431+
if constexpr (methods::QueryHas::getDefaultWithParams<T>)
432+
{
433+
return { _pimpl->getDefault(std::move(params)) };
434+
}
435+
else if constexpr (methods::QueryHas::getDefault<T>)
436+
{
437+
return { _pimpl->getDefault() };
438+
}
439+
else
440+
{
441+
throw std::runtime_error(R"ex(Query::getDefault is not implemented)ex");
442+
}
443+
}
444+
415445
void beginSelectionSet(const service::SelectionSetParams& params) const final
416446
{
417447
if constexpr (methods::QueryHas::beginSelectionSet<T>)

samples/today/schema.today.graphql

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,9 @@ type Query {
3737
testTaskState: TaskState!
3838

3939
anyType(ids: [ID!]!): [UnionType]!
40+
41+
"Test C++ keyword names"
42+
default: String
4043
}
4144

4245
"Node interface for Relay support"

0 commit comments

Comments
 (0)