Skip to content

Commit 6f9d42a

Browse files
author
Pawel Wojciechowski
committed
Hangle nulls and vectors
1 parent 55c876c commit 6f9d42a

File tree

1 file changed

+20
-2
lines changed

1 file changed

+20
-2
lines changed

include/graphqlservice/GraphQLService.h

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -421,6 +421,11 @@ class [[nodiscard]] AwaitableScalar
421421
std::variant<T, std::future<T>, std::shared_ptr<const response::Value>> _value;
422422
};
423423

424+
template <typename T>
425+
struct is_vector : std::false_type {};
426+
427+
template <typename T>
428+
struct is_vector<std::vector<T>> : std::true_type {};
424429
// Field accessors may return either a result of T, an awaitable of T, or a std::future<T>, so at
425430
// runtime the implementer may choose to return by value or defer/parallelize expensive operations
426431
// by returning an async future or an awaitable coroutine.
@@ -436,11 +441,24 @@ class [[nodiscard]] AwaitableObject
436441
}
437442

438443
template <typename U>
439-
AwaitableObject(U&& value,std::enable_if_t<!std::is_assignable_v<T,U>>* = nullptr)
440-
: _value ( std::make_shared<typename T::element_type>(value) )
444+
AwaitableObject(U&& value,std::enable_if_t<!std::is_assignable_v<T,U> && !is_vector<U>::value >* = nullptr)
445+
: _value ( value?std::make_shared<typename T::element_type>(value): std::shared_ptr<typename T::element_type>())
441446
{
442447
}
443448

449+
template <typename U>
450+
AwaitableObject(U&& value,std::enable_if_t<!std::is_assignable_v<T,U> && is_vector<U>::value >* = nullptr)
451+
{
452+
T vec;
453+
for(auto v:value){
454+
if(v)
455+
vec.push_back(std::make_shared<typename T::value_type::element_type>(v));
456+
else
457+
vec.push_back(std::shared_ptr<typename T::value_type::element_type>());
458+
}
459+
_value=std::move(vec);
460+
}
461+
444462
struct promise_type
445463
{
446464
[[nodiscard]] AwaitableObject<T> get_return_object() noexcept

0 commit comments

Comments
 (0)