@@ -357,6 +357,11 @@ class FieldResult
357
357
358
358
return value.wait_for (0s) != std::future_status::timeout;
359
359
}
360
+ else if constexpr (std::is_same_v<value_type,
361
+ std::shared_ptr<const response::Value>>)
362
+ {
363
+ return true ;
364
+ }
360
365
},
361
366
_value);
362
367
}
@@ -375,7 +380,7 @@ class FieldResult
375
380
T await_resume ()
376
381
{
377
382
return std::visit (
378
- [](auto && value) {
383
+ [](auto && value) -> T {
379
384
using value_type = std::decay_t <decltype (value)>;
380
385
381
386
if constexpr (std::is_same_v<value_type, T>)
@@ -386,12 +391,34 @@ class FieldResult
386
391
{
387
392
return value.get ();
388
393
}
394
+ else if constexpr (std::is_same_v<value_type,
395
+ std::shared_ptr<const response::Value>>)
396
+ {
397
+ throw std::logic_error (" Cannot await std::shared_ptr<const response::Value>" );
398
+ }
399
+ },
400
+ std::move (_value));
401
+ }
402
+
403
+ std::shared_ptr<const response::Value> get_value () noexcept
404
+ {
405
+ return std::visit (
406
+ [](auto && value) noexcept {
407
+ using value_type = std::decay_t <decltype (value)>;
408
+ std::shared_ptr<const response::Value> result;
409
+
410
+ if constexpr (std::is_same_v<value_type, std::shared_ptr<const response::Value>>)
411
+ {
412
+ result = std::move (value);
413
+ }
414
+
415
+ return result;
389
416
},
390
417
std::move (_value));
391
418
}
392
419
393
420
private:
394
- std::variant<T, std::future<T>> _value;
421
+ std::variant<T, std::future<T>, std::shared_ptr< const response::Value> > _value;
395
422
};
396
423
397
424
// Fragments are referenced by name and have a single type condition (except for inline
@@ -710,6 +737,13 @@ struct ModifiedResult
710
737
static_assert (std::is_same_v<std::shared_ptr<Type>, typename ResultTraits<Type>::type>,
711
738
" this is the derived object type" );
712
739
740
+ auto value = result.get_value ();
741
+
742
+ if (value)
743
+ {
744
+ co_return ResolverResult { response::Value { std::shared_ptr { std::move (value) } } };
745
+ }
746
+
713
747
co_await params.launch ;
714
748
715
749
auto awaitedResult = co_await ModifiedResult<Object>::convert (
@@ -738,6 +772,13 @@ struct ModifiedResult
738
772
convert (
739
773
typename ResultTraits<Type, Modifier, Other...>::future_type result, ResolverParams params)
740
774
{
775
+ auto value = result.get_value ();
776
+
777
+ if (value)
778
+ {
779
+ co_return ResolverResult { response::Value { std::shared_ptr { std::move (value) } } };
780
+ }
781
+
741
782
co_await params.launch ;
742
783
743
784
auto awaitedResult = co_await std::move (result);
@@ -765,6 +806,13 @@ struct ModifiedResult
765
806
typename ResultTraits<Type, Modifier, Other...>::type>,
766
807
" this is the optional version" );
767
808
809
+ auto value = result.get_value ();
810
+
811
+ if (value)
812
+ {
813
+ co_return ResolverResult { response::Value { std::shared_ptr { std::move (value) } } };
814
+ }
815
+
768
816
co_await params.launch ;
769
817
770
818
auto awaitedResult = co_await std::move (result);
@@ -785,6 +833,13 @@ struct ModifiedResult
785
833
static typename std::enable_if_t <TypeModifier::List == Modifier, AwaitableResolver> convert (
786
834
typename ResultTraits<Type, Modifier, Other...>::future_type result, ResolverParams params)
787
835
{
836
+ auto value = result.get_value ();
837
+
838
+ if (value)
839
+ {
840
+ co_return ResolverResult { response::Value { std::shared_ptr { std::move (value) } } };
841
+ }
842
+
788
843
std::vector<AwaitableResolver> children;
789
844
const auto parentPath = params.errorPath ;
790
845
@@ -879,6 +934,13 @@ struct ModifiedResult
879
934
static_assert (!std::is_base_of_v<Object, Type>,
880
935
" ModfiedResult<Object> needs special handling" );
881
936
937
+ auto value = result.get_value ();
938
+
939
+ if (value)
940
+ {
941
+ co_return ResolverResult { response::Value { std::shared_ptr { std::move (value) } } };
942
+ }
943
+
882
944
auto pendingResolver = std::move (resolver);
883
945
ResolverResult document;
884
946
0 commit comments