6#include <ydb-cpp-sdk/client/value/value.h>
14#include <userver/utils/assert.hpp>
15#include <userver/utils/constexpr_indices.hpp>
17#include <userver/ydb/io/generic_optional.hpp>
18#include <userver/ydb/io/traits.hpp>
20USERVER_NAMESPACE_BEGIN
26template <
typename Tuple, std::size_t... Indices>
27Tuple ParseTupleElements(NYdb::TValueParser& parser,
const ParseContext& context, std::index_sequence<Indices...>) {
29 const bool has_element = parser.TryNextElement();
31 return ydb::Parse<std::tuple_element_t<Indices, Tuple>>(parser, context);
35template <
typename Builder,
typename Tuple, std::size_t... Indices>
36void WriteTupleElements(NYdb::TValueBuilderBase<Builder>& builder,
const Tuple& value, std::index_sequence<Indices...>) {
46template <
typename... Args>
48 using TupleType = std::tuple<Args...>;
49 static constexpr auto kElementsCount =
sizeof...(Args);
51 static TupleType Parse(NYdb::TValueParser& parser,
const ParseContext& context) {
53 auto result = impl::ParseTupleElements<TupleType>(parser, context, std::make_index_sequence<kElementsCount>{});
58 template <
typename Builder>
59 static void Write(NYdb::TValueBuilderBase<Builder>& builder,
const TupleType& value) {
61 impl::WriteTupleElements(builder, value, std::make_index_sequence<kElementsCount>{});
65 static NYdb::TType MakeType() {
66 NYdb::TTypeBuilder builder;
68 (builder.AddElement(
ValueTraits<Args>::MakeType()), ...);
70 return builder.Build();
74template <
typename... Args>
75struct ValueTraits<std::optional<std::tuple<Args...>>> : impl::GenericOptionalValueTraits<std::tuple<Args...>> {};