userver: userver/ydb/builder.hpp Source File
Loading...
Searching...
No Matches
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() = default;
22
23 PreparedArgsBuilder(PreparedArgsBuilder&&) noexcept = default;
24 PreparedArgsBuilder& operator=(PreparedArgsBuilder&&) = delete;
25
26 explicit PreparedArgsBuilder(NYdb::TParamsBuilder&& builder)
27 : builder_(std::move(builder))
28 {}
29
30 /// Supported types and required includes are documented in:
31 /// <userver/ydb/io/supported_types.hpp>
32 template <typename T>
33 void Add(const std::string& name, T&& value);
34
35 /// @cond
36 // For internal use only.
37 template <typename... NamesValues>
38 void AddParams(NamesValues&&... names_values);
39 /// @endcond
40
41private:
42 friend class Transaction;
43 friend class TableClient;
44 friend class TxActor;
45 struct PreparedArgsWithKey;
46
47 NYdb::TParams Build() && { return std::move(builder_).Build(); }
48
49 PreparedArgsWithKey operator<<(const std::string& key);
50
51 NYdb::TParamsBuilder builder_;
52};
53
54template <typename T>
55void PreparedArgsBuilder::Add(const std::string& name, T&& value) {
56 auto& param_builder = builder_.AddParam(impl::ToString(name));
57 Write(param_builder, std::forward<T>(value));
58 param_builder.Build();
59}
60
61/// @cond
62template <typename... NamesValues>
63void PreparedArgsBuilder::AddParams(NamesValues&&... names_values) {
64 [[maybe_unused]] decltype(auto) result = (*this << ... << std::forward<NamesValues>(names_values));
65 static_assert(std::is_same_v<decltype(result), PreparedArgsBuilder&>);
66}
67/// @endcond
68
69struct PreparedArgsBuilder::PreparedArgsWithKey final {
70 PreparedArgsBuilder& builder;
71 const std::string& key;
72
73 template <typename T>
74 PreparedArgsBuilder& operator<<(T&& value) const {
75 builder.Add(key, std::forward<T>(value));
76 return builder;
77 }
78};
79
80inline auto PreparedArgsBuilder::operator<<(const std::string& key) -> PreparedArgsWithKey {
81 return PreparedArgsWithKey{*this, key};
82}
83
84} // namespace ydb
85
86USERVER_NAMESPACE_END