Skip to content

Commit e181977

Browse files
committed
Check for shared_ptr to Value before awaiting
1 parent 3b677d6 commit e181977

File tree

2 files changed

+71
-2
lines changed

2 files changed

+71
-2
lines changed

include/graphqlservice/GraphQLService.h

Lines changed: 64 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -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

393420
private:
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

src/GraphQLService.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -696,6 +696,13 @@ template <>
696696
AwaitableResolver ModifiedResult<Object>::convert(
697697
FieldResult<std::shared_ptr<Object>> result, ResolverParams params)
698698
{
699+
auto value = result.get_value();
700+
701+
if (value)
702+
{
703+
co_return ResolverResult { response::Value { std::shared_ptr { std::move(value) } } };
704+
}
705+
699706
requireSubFields(params);
700707

701708
co_await params.launch;

0 commit comments

Comments
 (0)