@@ -349,6 +349,11 @@ void ResolverVisitor::add_error(schema_error&& error)
349
349
_concept->add_error (std::move (error));
350
350
}
351
351
352
+ void ResolverVisitor::complete ()
353
+ {
354
+ _concept->complete ();
355
+ }
356
+
352
357
FieldParams::FieldParams (SelectionSetParams&& selectionSetParams, Directives directives)
353
358
: SelectionSetParams(std::move(selectionSetParams))
354
359
, fieldDirectives(std::move(directives))
@@ -852,6 +857,7 @@ class ResolverResultVisitor
852
857
void add_int (int value);
853
858
void add_float (double value);
854
859
void add_error (schema_error&& error);
860
+ void complete ();
855
861
856
862
response::Value document ();
857
863
@@ -952,6 +958,10 @@ void ResolverResultVisitor::add_error(schema_error&& error)
952
958
_errors.push_back (std::move (error));
953
959
}
954
960
961
+ void ResolverResultVisitor::complete ()
962
+ {
963
+ }
964
+
955
965
response::Value ResolverResultVisitor::document ()
956
966
{
957
967
response::Value document { response::Type::Map };
@@ -991,15 +1001,6 @@ void ResolverResultVisitor::add_value(response::Value&& value)
991
1001
}
992
1002
}
993
1003
994
- response::Value ResolverResult::toValue () &&
995
- {
996
- auto visitor = std::make_shared<ResolverResultVisitor>();
997
-
998
- (std::move (*this )).visit (std::make_shared<ResolverVisitor>(visitor));
999
-
1000
- return visitor->document ();
1001
- }
1002
-
1003
1004
void ResolverResult::visit (const std::shared_ptr<ResolverVisitor>& visitor) &&
1004
1005
{
1005
1006
for (auto & token : data)
@@ -1011,6 +1012,8 @@ void ResolverResult::visit(const std::shared_ptr<ResolverVisitor>& visitor) &&
1011
1012
{
1012
1013
visitor->add_error (std::move (error));
1013
1014
}
1015
+
1016
+ visitor->complete ();
1014
1017
}
1015
1018
1016
1019
template <>
@@ -1857,7 +1860,8 @@ void OperationDefinitionVisitor::visit(
1857
1860
1858
1861
SubscriptionData::SubscriptionData (std::shared_ptr<OperationData> data, SubscriptionName&& field,
1859
1862
response::Value arguments, Directives fieldDirectives, peg::ast&& query,
1860
- std::string&& operationName, SubscriptionCallback&& callback, const peg::ast_node& selection)
1863
+ std::string&& operationName, SubscriptionCallbackOrVisitor&& callback,
1864
+ const peg::ast_node& selection)
1861
1865
: data(std::move(data))
1862
1866
, field(std::move(field))
1863
1867
, arguments(std::move(arguments))
@@ -2154,6 +2158,15 @@ std::pair<std::string_view, const peg::ast_node*> Request::findOperationDefiniti
2154
2158
}
2155
2159
2156
2160
response::AwaitableValue Request::resolve (RequestResolveParams params) const
2161
+ {
2162
+ auto visitor = std::make_shared<ResolverResultVisitor>();
2163
+
2164
+ co_await visit (std::move (params), std::make_shared<ResolverVisitor>(visitor));
2165
+ co_return visitor->document ();
2166
+ }
2167
+
2168
+ AwaitableVisit Request::visit (
2169
+ RequestResolveParams params, const std::shared_ptr<ResolverVisitor>& resolverVisitor) const
2157
2170
{
2158
2171
try
2159
2172
{
@@ -2210,16 +2223,13 @@ response::AwaitableValue Request::resolve(RequestResolveParams params) const
2210
2223
co_await params.launch ;
2211
2224
operationVisitor.visit (operationType, *operationDefinition);
2212
2225
2213
- co_return (co_await operationVisitor.getValue ()).toValue ( );
2226
+ (co_await operationVisitor.getValue ()).visit (resolverVisitor );
2214
2227
}
2215
2228
catch (schema_exception& ex)
2216
2229
{
2217
- response::Value document (response::Type::Map) ;
2230
+ ResolverResult document { {}, ex. getStructuredErrors () } ;
2218
2231
2219
- document.emplace_back (std::string { strData }, response::Value ());
2220
- document.emplace_back (std::string { strErrors }, ex.getErrors ());
2221
-
2222
- co_return std::move (document);
2232
+ std::move (document).visit (resolverVisitor);
2223
2233
}
2224
2234
}
2225
2235
@@ -2380,26 +2390,42 @@ AwaitableDeliver Request::deliver(RequestDeliverParams params) const
2380
2390
params.launch ,
2381
2391
};
2382
2392
2383
- response::Value document { response::Type::Map };
2393
+ ResolverResult document {};
2384
2394
2385
2395
try
2386
2396
{
2387
2397
co_await params.launch ;
2388
2398
2389
- auto result = co_await optionalOrDefaultSubscription->resolve (selectionSetParams,
2399
+ document = co_await optionalOrDefaultSubscription->resolve (selectionSetParams,
2390
2400
registration->selection ,
2391
2401
registration->data ->fragments ,
2392
2402
registration->data ->variables );
2393
-
2394
- document = std::move (result).toValue ();
2395
2403
}
2396
2404
catch (schema_exception& ex)
2397
2405
{
2398
- document.emplace_back (std::string { strData }, response::Value ());
2399
- document.emplace_back (std::string { strErrors }, ex.getErrors ());
2406
+ document.errors .splice (document.errors .end (), ex.getStructuredErrors ());
2400
2407
}
2401
2408
2402
- registration->callback (std::move (document));
2409
+ std::visit (
2410
+ [result = std::move (document)](const auto & callback) mutable {
2411
+ using callback_type = std::decay_t <decltype (callback)>;
2412
+
2413
+ if constexpr (std::is_same_v<callback_type, SubscriptionCallback>)
2414
+ {
2415
+ auto visitor = std::make_shared<ResolverResultVisitor>();
2416
+
2417
+ (std::move (result)).visit (std::make_shared<ResolverVisitor>(visitor));
2418
+
2419
+ callback (visitor->document ());
2420
+ }
2421
+ else if constexpr (std::is_same_v<callback_type, SubscriptionVisitor>)
2422
+ {
2423
+ auto visitor = callback ();
2424
+
2425
+ (std::move (result)).visit (visitor);
2426
+ }
2427
+ },
2428
+ registration->callback );
2403
2429
}
2404
2430
2405
2431
co_return ;
0 commit comments