Skip to content

Commit 98d1229

Browse files
authored
Merge pull request #342 from wravery/next
2 parents f5fa468 + 9bf6d47 commit 98d1229

15 files changed

+191
-92
lines changed

samples/CMakeLists.txt

+2-9
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,10 @@
33

44
cmake_minimum_required(VERSION 3.28)
55

6-
if(GRAPHQL_BUILD_MODULES)
7-
add_subdirectory(today)
8-
endif()
9-
6+
add_subdirectory(today)
107
add_subdirectory(client)
118
add_subdirectory(learn)
12-
13-
if(GRAPHQL_BUILD_MODULES)
14-
add_subdirectory(stitched)
15-
endif()
16-
9+
add_subdirectory(stitched)
1710
add_subdirectory(validation)
1811

1912
if(GRAPHQL_BUILD_HTTP_SAMPLE)

samples/client/query/QueryClient.cpp

+33
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ const std::string& GetRequestText() noexcept
7878
subject
7979
when
8080
isNow
81+
array
8182
}
8283
}
8384
@@ -431,6 +432,11 @@ graphql::query::client::query::Query::Response::anyType_UnionType Response<graph
431432
result.isNow = ModifiedResponse<bool>::parse(std::move(member.second));
432433
continue;
433434
}
435+
if (member.first == R"js(array)js"sv)
436+
{
437+
result.array = ModifiedResponse<response::IdType>::parse<TypeModifier::List>(std::move(member.second));
438+
continue;
439+
}
434440
}
435441
}
436442

@@ -492,6 +498,9 @@ struct ResponseVisitor::impl
492498
Member_anyType_0_subject,
493499
Member_anyType_0_when,
494500
Member_anyType_0_isNow,
501+
Member_anyType_0_array,
502+
Member_anyType_0_array_0,
503+
Member_anyType_0_array_0_,
495504
Member_default_,
496505
Complete,
497506
};
@@ -666,6 +675,10 @@ void ResponseVisitor::add_value([[maybe_unused]] std::shared_ptr<const response:
666675
_pimpl->response.anyType.back()->isNow = ModifiedResponse<bool>::parse(response::Value { *value });
667676
break;
668677

678+
case impl::VisitorState::Member_anyType_0_array_0:
679+
_pimpl->response.anyType.back()->array.push_back(ModifiedResponse<response::IdType>::parse(response::Value { *value }));
680+
break;
681+
669682
case impl::VisitorState::Member_default_:
670683
_pimpl->state = impl::VisitorState::Start;
671684
_pimpl->response.default_ = ModifiedResponse<std::string>::parse<TypeModifier::Nullable>(response::Value { *value });
@@ -699,6 +712,10 @@ void ResponseVisitor::reserve([[maybe_unused]] std::size_t count)
699712
_pimpl->response.anyType.reserve(count);
700713
break;
701714

715+
case impl::VisitorState::Member_anyType_0_array_0:
716+
_pimpl->response.anyType.back()->array.reserve(count);
717+
break;
718+
702719
case impl::VisitorState::Complete:
703720
break;
704721

@@ -914,6 +931,10 @@ void ResponseVisitor::add_member([[maybe_unused]] std::string&& key)
914931
{
915932
_pimpl->state = impl::VisitorState::Member_anyType_0_isNow;
916933
}
934+
else if (key == "array"sv)
935+
{
936+
_pimpl->state = impl::VisitorState::Member_anyType_0_array;
937+
}
917938
break;
918939

919940
case impl::VisitorState::Complete:
@@ -999,6 +1020,10 @@ void ResponseVisitor::start_array()
9991020
_pimpl->state = impl::VisitorState::Member_anyType_0;
10001021
break;
10011022

1023+
case impl::VisitorState::Member_anyType_0_array:
1024+
_pimpl->state = impl::VisitorState::Member_anyType_0_array_0;
1025+
break;
1026+
10021027
case impl::VisitorState::Complete:
10031028
break;
10041029

@@ -1027,6 +1052,10 @@ void ResponseVisitor::end_array()
10271052
_pimpl->state = impl::VisitorState::Start;
10281053
break;
10291054

1055+
case impl::VisitorState::Member_anyType_0_array_0:
1056+
_pimpl->state = impl::VisitorState::Member_anyType_0_;
1057+
break;
1058+
10301059
case impl::VisitorState::Complete:
10311060
break;
10321061

@@ -1226,6 +1255,10 @@ void ResponseVisitor::add_id([[maybe_unused]] response::IdType&& value)
12261255
_pimpl->response.anyType.back()->id = std::move(value);
12271256
break;
12281257

1258+
case impl::VisitorState::Member_anyType_0_array_0:
1259+
_pimpl->response.anyType.back()->array.push_back(std::move(value));
1260+
break;
1261+
12291262
case impl::VisitorState::Complete:
12301263
break;
12311264

samples/client/query/QueryClient.h

+2
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ namespace graphql::query {
8181
/// subject
8282
/// when
8383
/// isNow
84+
/// array
8485
/// }
8586
/// }
8687
///
@@ -184,6 +185,7 @@ struct [[nodiscard("unnecessary construction")]] Response
184185
std::optional<std::string> subject {};
185186
std::optional<response::Value> when {};
186187
bool isNow {};
188+
std::vector<response::IdType> array {};
187189
};
188190

189191
appointments_AppointmentConnection appointments {};

samples/client/query/query.today.graphql

+1
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ query {
5353
subject
5454
when
5555
isNow
56+
array
5657
}
5758
}
5859

samples/proxy/query/ProxyClient.cpp

-5
Original file line numberDiff line numberDiff line change
@@ -236,11 +236,6 @@ void ResponseVisitor::start_object()
236236
{
237237
switch (_pimpl->state)
238238
{
239-
case impl::VisitorState::Member_relay_errors_0:
240-
_pimpl->state = impl::VisitorState::Member_relay_errors_0_;
241-
_pimpl->response.relay.errors->push_back(std::make_optional<std::string>({}));
242-
break;
243-
244239
case impl::VisitorState::Complete:
245240
break;
246241

samples/today/CMakeLists.txt

+46-44
Original file line numberDiff line numberDiff line change
@@ -37,49 +37,51 @@ if(MSVC)
3737
target_compile_options(todaygraphql_nointrospection PUBLIC /wd4702)
3838
endif()
3939

40-
# sample
41-
add_executable(sample sample.cpp)
42-
target_link_libraries(sample PRIVATE
43-
todaygraphql
44-
graphqljson)
45-
46-
# sample_nointrospection
47-
add_executable(sample_nointrospection sample.cpp)
48-
target_link_libraries(sample_nointrospection PRIVATE
49-
todaygraphql_nointrospection
50-
graphqljson)
51-
52-
# benchmark
53-
add_executable(benchmark benchmark.cpp)
54-
target_link_libraries(benchmark PRIVATE
55-
todaygraphql
56-
graphqljson)
57-
58-
# benchmark_nointrospection
59-
add_executable(benchmark_nointrospection benchmark.cpp)
60-
target_link_libraries(benchmark_nointrospection PRIVATE
61-
todaygraphql_nointrospection
62-
graphqljson)
63-
64-
if(WIN32 AND BUILD_SHARED_LIBS)
65-
add_custom_command(OUTPUT copied_sample_dlls
66-
COMMAND ${CMAKE_COMMAND} -E copy_if_different
67-
$<TARGET_FILE:graphqlservice>
68-
$<TARGET_FILE:graphqljson>
69-
$<TARGET_FILE:graphqlpeg>
70-
$<TARGET_FILE:graphqlresponse>
71-
${CMAKE_CURRENT_BINARY_DIR}
72-
COMMAND ${CMAKE_COMMAND} -E touch copied_sample_dlls
73-
DEPENDS
74-
graphqlservice
75-
graphqljson
76-
graphqlpeg
77-
graphqlresponse)
78-
79-
add_custom_target(copy_today_sample_dlls DEPENDS copied_sample_dlls)
40+
if(GRAPHQL_BUILD_MODULES)
41+
# sample
42+
add_executable(sample sample.cpp)
43+
target_link_libraries(sample PRIVATE
44+
todaygraphql
45+
graphqljson)
8046

81-
add_dependencies(sample copy_today_sample_dlls)
82-
add_dependencies(sample_nointrospection copy_today_sample_dlls)
83-
add_dependencies(benchmark copy_today_sample_dlls)
84-
add_dependencies(benchmark_nointrospection copy_today_sample_dlls)
47+
# sample_nointrospection
48+
add_executable(sample_nointrospection sample.cpp)
49+
target_link_libraries(sample_nointrospection PRIVATE
50+
todaygraphql_nointrospection
51+
graphqljson)
52+
53+
# benchmark
54+
add_executable(benchmark benchmark.cpp)
55+
target_link_libraries(benchmark PRIVATE
56+
todaygraphql
57+
graphqljson)
58+
59+
# benchmark_nointrospection
60+
add_executable(benchmark_nointrospection benchmark.cpp)
61+
target_link_libraries(benchmark_nointrospection PRIVATE
62+
todaygraphql_nointrospection
63+
graphqljson)
64+
65+
if(WIN32 AND BUILD_SHARED_LIBS)
66+
add_custom_command(OUTPUT copied_sample_dlls
67+
COMMAND ${CMAKE_COMMAND} -E copy_if_different
68+
$<TARGET_FILE:graphqlservice>
69+
$<TARGET_FILE:graphqljson>
70+
$<TARGET_FILE:graphqlpeg>
71+
$<TARGET_FILE:graphqlresponse>
72+
${CMAKE_CURRENT_BINARY_DIR}
73+
COMMAND ${CMAKE_COMMAND} -E touch copied_sample_dlls
74+
DEPENDS
75+
graphqlservice
76+
graphqljson
77+
graphqlpeg
78+
graphqlresponse)
79+
80+
add_custom_target(copy_today_sample_dlls DEPENDS copied_sample_dlls)
81+
82+
add_dependencies(sample copy_today_sample_dlls)
83+
add_dependencies(sample_nointrospection copy_today_sample_dlls)
84+
add_dependencies(benchmark copy_today_sample_dlls)
85+
add_dependencies(benchmark_nointrospection copy_today_sample_dlls)
86+
endif()
8587
endif()

samples/today/TodayMock.cpp

+5
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,11 @@ std::optional<std::string> Appointment::getForceError() const
186186
throw std::runtime_error(R"ex(this error was forced)ex");
187187
}
188188

189+
std::vector<response::IdType> Appointment::getArray() const
190+
{
191+
return {};
192+
}
193+
189194
AppointmentEdge::AppointmentEdge(std::shared_ptr<Appointment> appointment)
190195
: _appointment(std::move(appointment))
191196
{

samples/today/TodayMock.h

+1
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,7 @@ class Appointment
146146
std::shared_ptr<const response::Value> getSubject() const noexcept;
147147
bool getIsNow() const noexcept;
148148
std::optional<std::string> getForceError() const;
149+
std::vector<response::IdType> getArray() const;
149150

150151
private:
151152
response::IdType _id;

samples/today/nointrospection/AppointmentObject.cpp

+14-1
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ service::ResolverMap Appointment::getResolvers() const noexcept
3939
return {
4040
{ R"gql(id)gql"sv, [this](service::ResolverParams&& params) { return resolveId(std::move(params)); } },
4141
{ R"gql(when)gql"sv, [this](service::ResolverParams&& params) { return resolveWhen(std::move(params)); } },
42+
{ R"gql(array)gql"sv, [this](service::ResolverParams&& params) { return resolveArray(std::move(params)); } },
4243
{ R"gql(isNow)gql"sv, [this](service::ResolverParams&& params) { return resolveIsNow(std::move(params)); } },
4344
{ R"gql(subject)gql"sv, [this](service::ResolverParams&& params) { return resolveSubject(std::move(params)); } },
4445
{ R"gql(__typename)gql"sv, [this](service::ResolverParams&& params) { return resolve_typename(std::move(params)); } },
@@ -111,6 +112,17 @@ service::AwaitableResolver Appointment::resolveForceError(service::ResolverParam
111112
return service::ModifiedResult<std::string>::convert<service::TypeModifier::Nullable>(std::move(result), std::move(params));
112113
}
113114

115+
service::AwaitableResolver Appointment::resolveArray(service::ResolverParams&& params) const
116+
{
117+
std::unique_lock resolverLock(_resolverMutex);
118+
service::SelectionSetParams selectionSetParams { static_cast<const service::SelectionSetParams&>(params) };
119+
auto directives = std::move(params.fieldDirectives);
120+
auto result = _pimpl->getArray(service::FieldParams { std::move(selectionSetParams), std::move(directives) });
121+
resolverLock.unlock();
122+
123+
return service::ModifiedResult<response::IdType>::convert<service::TypeModifier::List>(std::move(result), std::move(params));
124+
}
125+
114126
service::AwaitableResolver Appointment::resolve_typename(service::ResolverParams&& params) const
115127
{
116128
return service::Result<std::string>::convert(std::string{ R"gql(Appointment)gql" }, std::move(params));
@@ -128,7 +140,8 @@ void AddAppointmentDetails(const std::shared_ptr<schema::ObjectType>& typeAppoin
128140
schema::Field::Make(R"gql(when)gql"sv, R"md()md"sv, std::nullopt, schema->LookupType(R"gql(DateTime)gql"sv)),
129141
schema::Field::Make(R"gql(subject)gql"sv, R"md()md"sv, std::nullopt, schema->LookupType(R"gql(String)gql"sv)),
130142
schema::Field::Make(R"gql(isNow)gql"sv, R"md()md"sv, std::nullopt, schema->WrapType(introspection::TypeKind::NON_NULL, schema->LookupType(R"gql(Boolean)gql"sv))),
131-
schema::Field::Make(R"gql(forceError)gql"sv, R"md()md"sv, std::nullopt, schema->LookupType(R"gql(String)gql"sv))
143+
schema::Field::Make(R"gql(forceError)gql"sv, R"md()md"sv, std::nullopt, schema->LookupType(R"gql(String)gql"sv)),
144+
schema::Field::Make(R"gql(array)gql"sv, R"md()md"sv, std::nullopt, schema->WrapType(introspection::TypeKind::NON_NULL, schema->WrapType(introspection::TypeKind::LIST, schema->WrapType(introspection::TypeKind::NON_NULL, schema->LookupType(R"gql(ID)gql"sv)))))
132145
});
133146
}
134147

samples/today/nointrospection/TodayAppointmentObject.h

+30
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,18 @@ concept getForceError = requires (TImpl impl)
8080
{ service::AwaitableScalar<std::optional<std::string>> { impl.getForceError() } };
8181
};
8282

83+
template <class TImpl>
84+
concept getArrayWithParams = requires (TImpl impl, service::FieldParams params)
85+
{
86+
{ service::AwaitableScalar<std::vector<response::IdType>> { impl.getArray(std::move(params)) } };
87+
};
88+
89+
template <class TImpl>
90+
concept getArray = requires (TImpl impl)
91+
{
92+
{ service::AwaitableScalar<std::vector<response::IdType>> { impl.getArray() } };
93+
};
94+
8395
template <class TImpl>
8496
concept beginSelectionSet = requires (TImpl impl, const service::SelectionSetParams params)
8597
{
@@ -103,6 +115,7 @@ class [[nodiscard("unnecessary construction")]] Appointment final
103115
[[nodiscard("unnecessary call")]] service::AwaitableResolver resolveSubject(service::ResolverParams&& params) const;
104116
[[nodiscard("unnecessary call")]] service::AwaitableResolver resolveIsNow(service::ResolverParams&& params) const;
105117
[[nodiscard("unnecessary call")]] service::AwaitableResolver resolveForceError(service::ResolverParams&& params) const;
118+
[[nodiscard("unnecessary call")]] service::AwaitableResolver resolveArray(service::ResolverParams&& params) const;
106119

107120
[[nodiscard("unnecessary call")]] service::AwaitableResolver resolve_typename(service::ResolverParams&& params) const;
108121

@@ -118,6 +131,7 @@ class [[nodiscard("unnecessary construction")]] Appointment final
118131
[[nodiscard("unnecessary call")]] virtual service::AwaitableScalar<std::optional<std::string>> getSubject(service::FieldParams&& params) const = 0;
119132
[[nodiscard("unnecessary call")]] virtual service::AwaitableScalar<bool> getIsNow(service::FieldParams&& params) const = 0;
120133
[[nodiscard("unnecessary call")]] virtual service::AwaitableScalar<std::optional<std::string>> getForceError(service::FieldParams&& params) const = 0;
134+
[[nodiscard("unnecessary call")]] virtual service::AwaitableScalar<std::vector<response::IdType>> getArray(service::FieldParams&& params) const = 0;
121135
};
122136

123137
template <class T>
@@ -209,6 +223,22 @@ class [[nodiscard("unnecessary construction")]] Appointment final
209223
}
210224
}
211225

226+
[[nodiscard("unnecessary call")]] service::AwaitableScalar<std::vector<response::IdType>> getArray(service::FieldParams&& params) const override
227+
{
228+
if constexpr (methods::AppointmentHas::getArrayWithParams<T>)
229+
{
230+
return { _pimpl->getArray(std::move(params)) };
231+
}
232+
else if constexpr (methods::AppointmentHas::getArray<T>)
233+
{
234+
return { _pimpl->getArray() };
235+
}
236+
else
237+
{
238+
throw service::unimplemented_method(R"ex(Appointment::getArray)ex");
239+
}
240+
}
241+
212242
void beginSelectionSet(const service::SelectionSetParams& params) const override
213243
{
214244
if constexpr (methods::AppointmentHas::beginSelectionSet<T>)

samples/today/schema.today.graphql

+1
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,7 @@ type Appointment implements Node {
132132
subject: String
133133
isNow: Boolean!
134134
forceError: String
135+
array: [ID!]!
135136
}
136137

137138
type Task implements Node {

0 commit comments

Comments
 (0)