11#include <userver/formats/json/impl/types.hpp>
12#include <userver/formats/json/value.hpp>
14USERVER_NAMESPACE_BEGIN
21template <
typename... Args>
27template <
typename... Args>
32class InlineObjectBuilder {
34 InlineObjectBuilder();
36 template <
typename... Args>
38 static_assert(
sizeof...(args) % 2 == 0,
"Cannot build an object from an odd number of key-value arguments");
39 Reserve(
sizeof...(args) / 2);
40 return DoBuild(std::forward<Args>(args)...);
46 template <
typename FieldValue,
typename... Tail>
47 formats::
json::Value DoBuild(std::string_view key, FieldValue&& value, Tail&&... tail) {
48 Append(key, std::forward<FieldValue>(value));
49 return DoBuild(std::forward<Tail>(tail)...);
54 void Append(std::string_view key, std::nullptr_t);
55 void Append(std::string_view key,
bool);
56 void Append(std::string_view key,
int);
57 void Append(std::string_view key,
unsigned int);
58 void Append(std::string_view key,
long);
59 void Append(std::string_view key,
unsigned long);
60 void Append(std::string_view key,
long long);
61 void Append(std::string_view key,
unsigned long long);
62 void Append(std::string_view key,
double);
63 void Append(std::string_view key,
const char*);
64 void Append(std::string_view key, std::string_view);
65 void Append(std::string_view key, std::chrono::system_clock::time_point);
67 void Append(std::string_view key,
const formats::
json::Value&);
69 VersionedValuePtr json_;
72class InlineArrayBuilder {
78 template <
typename... Elements>
79 formats::
json::Value Build(Elements&&... elements) {
80 Reserve(
sizeof...(elements));
81 (Append(std::forward<Elements>(elements)), ...);
88 void Append(std::nullptr_t);
91 void Append(
unsigned int);
93 void Append(
unsigned long);
94 void Append(
long long);
95 void Append(
unsigned long long);
97 void Append(
const char*);
98 void Append(std::string_view);
99 void Append(std::chrono::system_clock::time_point);
103 VersionedValuePtr json_;
109template <
typename... Args>
111 return impl::InlineObjectBuilder().Build(std::forward<Args>(args)...);
114template <
typename... Args>
116 return impl::InlineArrayBuilder().Build(std::forward<Args>(args)...);