@@ -357,6 +357,11 @@ class FieldResult
357357
358358 return value.wait_for (0s) != std::future_status::timeout;
359359 }
360+ else if constexpr (std::is_same_v<value_type,
361+ std::shared_ptr<const response::Value>>)
362+ {
363+ return true ;
364+ }
360365 },
361366 _value);
362367 }
@@ -375,7 +380,7 @@ class FieldResult
375380 T await_resume ()
376381 {
377382 return std::visit (
378- [](auto && value) {
383+ [](auto && value) -> T {
379384 using value_type = std::decay_t <decltype (value)>;
380385
381386 if constexpr (std::is_same_v<value_type, T>)
@@ -386,12 +391,34 @@ class FieldResult
386391 {
387392 return value.get ();
388393 }
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;
389416 },
390417 std::move (_value));
391418 }
392419
393420private:
394- std::variant<T, std::future<T>> _value;
421+ std::variant<T, std::future<T>, std::shared_ptr< const response::Value> > _value;
395422};
396423
397424// Fragments are referenced by name and have a single type condition (except for inline
@@ -710,6 +737,13 @@ struct ModifiedResult
710737 static_assert (std::is_same_v<std::shared_ptr<Type>, typename ResultTraits<Type>::type>,
711738 " this is the derived object type" );
712739
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+
713747 co_await params.launch ;
714748
715749 auto awaitedResult = co_await ModifiedResult<Object>::convert (
@@ -738,6 +772,13 @@ struct ModifiedResult
738772 convert (
739773 typename ResultTraits<Type, Modifier, Other...>::future_type result, ResolverParams params)
740774 {
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+
741782 co_await params.launch ;
742783
743784 auto awaitedResult = co_await std::move (result);
@@ -765,6 +806,13 @@ struct ModifiedResult
765806 typename ResultTraits<Type, Modifier, Other...>::type>,
766807 " this is the optional version" );
767808
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+
768816 co_await params.launch ;
769817
770818 auto awaitedResult = co_await std::move (result);
@@ -785,6 +833,13 @@ struct ModifiedResult
785833 static typename std::enable_if_t <TypeModifier::List == Modifier, AwaitableResolver> convert (
786834 typename ResultTraits<Type, Modifier, Other...>::future_type result, ResolverParams params)
787835 {
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+
788843 std::vector<AwaitableResolver> children;
789844 const auto parentPath = params.errorPath ;
790845
@@ -879,6 +934,13 @@ struct ModifiedResult
879934 static_assert (!std::is_base_of_v<Object, Type>,
880935 " ModfiedResult<Object> needs special handling" );
881936
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+
882944 auto pendingResolver = std::move (resolver);
883945 ResolverResult document;
884946
0 commit comments