userver: userver/ydb/builder.hpp Source File
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages Concepts
builder.hpp
1#pragma once
2
3#include <ydb-cpp-sdk/client/params/params.h>
4
5#include <string>
6#include <type_traits>
7#include <utility>
8
9#include <userver/ydb/impl/cast.hpp>
10#include <userver/ydb/io/traits.hpp>
11
12USERVER_NAMESPACE_BEGIN
13
14namespace ydb {
15
16class TableClient;
17class Transaction;
18
19class PreparedArgsBuilder final {
20public:
21 PreparedArgsBuilder(PreparedArgsBuilder&&) noexcept = default;
22 PreparedArgsBuilder& operator=(PreparedArgsBuilder&&) = delete;
23
24 /// Supported types and required includes are documented in:
25 /// <userver/ydb/io/supported_types.hpp>
26 template <typename T>
27 void Add(const std::string& name, T&& value);
28
29 /// @cond
30 // For internal use only.
31 explicit PreparedArgsBuilder(NYdb::TParamsBuilder&& builder) : builder_(std::move(builder)) {}
32
33 // For internal use only.
34 template <typename... NamesValues>
35 void AddParams(NamesValues&&... names_values);
36 /// @endcond
37
38private:
39 friend class Transaction;
40 friend class TableClient;
41 struct PreparedArgsWithKey;
42
43 NYdb::TParams Build() && { return std::move(builder_).Build(); }
44
45 PreparedArgsWithKey operator<<(const std::string& key);
46
47 NYdb::TParamsBuilder builder_;
48};
49
50template <typename T>
51void PreparedArgsBuilder::Add(const std::string& name, T&& value) {
52 auto& param_builder = builder_.AddParam(impl::ToString(name));
53 Write(param_builder, std::forward<T>(value));
54 param_builder.Build();
55}
56
57/// @cond
58template <typename... NamesValues>
59void PreparedArgsBuilder::AddParams(NamesValues&&... names_values) {
60 [[maybe_unused]] decltype(auto) result = (*this << ... << std::forward<NamesValues>(names_values));
61 static_assert(std::is_same_v<decltype(result), PreparedArgsBuilder&>);
62}
63/// @endcond
64
65struct PreparedArgsBuilder::PreparedArgsWithKey final {
66 PreparedArgsBuilder& builder;
67 const std::string& key;
68
69 template <typename T>
70 PreparedArgsBuilder& operator<<(T&& value) const {
71 builder.Add(key, std::forward<T>(value));
72 return builder;
73 }
74};
75
76inline auto PreparedArgsBuilder::operator<<(const std::string& key) -> PreparedArgsWithKey {
77 return PreparedArgsWithKey{*this, key};
78}
79
80} // namespace ydb
81
82USERVER_NAMESPACE_END