userver: userver/ydb/io/generic_optional.hpp Source File
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages Concepts
generic_optional.hpp
1#pragma once
2
3#include <ydb-cpp-sdk/client/value/value.h>
4
5#include <optional>
6
7#include <userver/ydb/io/traits.hpp>
8
9USERVER_NAMESPACE_BEGIN
10
11namespace ydb::impl {
12
13template <typename T>
14struct GenericOptionalValueTraits {
15 static std::optional<T> Parse(NYdb::TValueParser& parser, const ParseContext& context) {
16 std::optional<T> result;
17 parser.OpenOptional();
18 if (!parser.IsNull()) {
19 result.emplace(ValueTraits<T>::Parse(parser, context));
20 }
21 parser.CloseOptional();
22 return result;
23 }
24
25 template <typename Builder, typename U = const std::optional<T>&>
26 static void Write(NYdb::TValueBuilderBase<Builder>& builder, U&& value) {
27 if (value.has_value()) {
28 builder.BeginOptional();
29 ValueTraits<T>::Write(builder, std::forward<U>(value).value());
30 builder.EndOptional();
31 } else {
32 builder.EmptyOptional(ValueTraits<T>::MakeType());
33 }
34 }
35
36 static NYdb::TType MakeType() {
37 NYdb::TTypeBuilder builder;
38 builder.Optional(ValueTraits<T>::MakeType());
39 return builder.Build();
40 }
41};
42
43} // namespace ydb::impl
44
45USERVER_NAMESPACE_END