8#include <userver/formats/bson/bson_builder.hpp>
9#include <userver/formats/bson/document.hpp>
10#include <userver/formats/bson/types.hpp>
11#include <userver/formats/bson/value.hpp>
12#include <userver/utils/fast_pimpl.hpp>
14USERVER_NAMESPACE_BEGIN
16namespace formats::
bson {
19template <
typename... Args>
23template <
typename... Args>
28class InlineDocBuilder {
30 using Key = std::string_view;
34 template <
typename FieldValue,
typename... Tail>
35 Document Build(Key key, FieldValue&& value, Tail&&... tail) {
36 builder_.Append(key, std::forward<FieldValue>(value));
37 return Build(std::forward<Tail>(tail)...);
44class InlineArrayBuilder {
47 ~InlineArrayBuilder();
51 template <
typename Element,
typename... Tail>
52 Value Build(Element&& element, Tail&&... tail) {
53 builder_.Append(GetKey(), std::forward<Element>(element));
54 return Build(std::forward<Tail>(tail)...);
58 std::string_view GetKey();
61 static constexpr size_t kSize = 20;
62 static constexpr size_t kAlignment = 4;
63 utils::FastPimpl<Helper, kSize, kAlignment,
true> helper_;
70template <
typename... Args>
72 return impl::InlineDocBuilder().Build(std::forward<Args>(args)...);
75template <
typename... Args>
77 return impl::InlineArrayBuilder().Build(std::forward<Args>(args)...);