Skip to content

Commit eb0b4b2

Browse files
author
Pawel Wojciechowski
committed
Handle optional vector
1 parent 6f9d42a commit eb0b4b2

File tree

1 file changed

+29
-1
lines changed

1 file changed

+29
-1
lines changed

include/graphqlservice/GraphQLService.h

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -426,6 +426,14 @@ struct is_vector : std::false_type {};
426426

427427
template <typename T>
428428
struct is_vector<std::vector<T>> : std::true_type {};
429+
430+
template <typename T>
431+
struct is_optional : std::false_type {};
432+
433+
template <typename T>
434+
struct is_optional<std::optional<T> > : std::true_type {};
435+
436+
429437
// Field accessors may return either a result of T, an awaitable of T, or a std::future<T>, so at
430438
// runtime the implementer may choose to return by value or defer/parallelize expensive operations
431439
// by returning an async future or an awaitable coroutine.
@@ -434,18 +442,37 @@ class [[nodiscard]] AwaitableObject
434442
{
435443
public:
436444

445+
437446
template <typename U>
438447
AwaitableObject(U&& value, std::enable_if_t<std::is_assignable_v<T,U>>* = nullptr)
439448
: _value { std::forward<U>(value) }
440449
{
441450
}
442451

443452
template <typename U>
444-
AwaitableObject(U&& value,std::enable_if_t<!std::is_assignable_v<T,U> && !is_vector<U>::value >* = nullptr)
453+
AwaitableObject(U&& value,std::enable_if_t<!std::is_assignable_v<T,U> && !is_vector<U>::value && !is_optional<U>::value >* = nullptr)
445454
: _value ( value?std::make_shared<typename T::element_type>(value): std::shared_ptr<typename T::element_type>())
446455
{
447456
}
448457

458+
459+
template <typename U>
460+
AwaitableObject(U&& value,std::enable_if_t<!std::is_assignable_v<T,U> && is_optional<U>::value && is_vector<typename U::value_type>::value >* = nullptr)
461+
{
462+
if(!value)
463+
return;
464+
typename T::value_type vec;
465+
for(auto v:*value){
466+
if(v)
467+
vec.push_back(std::make_shared<typename T::value_type::value_type::element_type>(v));
468+
else
469+
vec.push_back(std::shared_ptr<typename T::value_type::value_type::element_type>());
470+
}
471+
_value=std::move(vec);
472+
}
473+
474+
475+
449476
template <typename U>
450477
AwaitableObject(U&& value,std::enable_if_t<!std::is_assignable_v<T,U> && is_vector<U>::value >* = nullptr)
451478
{
@@ -459,6 +486,7 @@ class [[nodiscard]] AwaitableObject
459486
_value=std::move(vec);
460487
}
461488

489+
462490
struct promise_type
463491
{
464492
[[nodiscard]] AwaitableObject<T> get_return_object() noexcept

0 commit comments

Comments
 (0)