Skip to content

Commit 1d0c37f

Browse files
Added functions for writing root
1 parent ee3981d commit 1d0c37f

File tree

1 file changed

+33
-13
lines changed

1 file changed

+33
-13
lines changed

include/rfl/bson/Writer.hpp

Lines changed: 33 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,9 @@ namespace bson {
2121

2222
/// Please refer to https://mongoc.org/libbson/current/api.html
2323
class Writer {
24-
using ParentType = std::variant<bson_t*, bson_array_builder_t*>;
24+
struct IsRoot {};
25+
26+
using ParentType = std::variant<bson_t*, bson_array_builder_t*, IsRoot>;
2527

2628
public:
2729
struct BSONOutputArray {
@@ -44,22 +46,32 @@ class Writer {
4446
using OutputObjectType = BSONOutputObject;
4547
using OutputVarType = BSONOutputVar;
4648

47-
Writer() : { bson_init(&doc_); }
49+
Writer() : {}
4850

4951
~Writer() = default;
5052

51-
// TODO
52-
OutputArrayType array_as_root(const size_t _size) const noexcept {}
53+
OutputArrayType array_as_root(const size_t _size) const noexcept {
54+
bson_array_builder_t* val = bson_array_builder_new();
55+
return OutputObjectType(val, IsRoot{});
56+
}
5357

54-
// TODO
55-
OutputObjectType object_as_root(const size_t _size) const noexcept {}
58+
OutputObjectType object_as_root(const size_t _size) const noexcept {
59+
bson_t val;
60+
bson_init(&val);
61+
return OutputObjectType(val, IsRoot{});
62+
}
5663

57-
// TODO
58-
OutputVarType null_as_root() const noexcept {}
64+
OutputVarType null_as_root() const noexcept {
65+
// Appears to be unsupported by the BSON C API.
66+
return OutputVarType{};
67+
}
5968

60-
// TODO
6169
template <class T>
62-
OutputVarType value_as_root(const T& _var) const noexcept {}
70+
OutputVarType value_as_root(const T& _var) const noexcept {
71+
static_assert(rfl::always_false_v<T>,
72+
"BSON only allows arrays or objects as its root.");
73+
return OutputVarType{};
74+
}
6375

6476
OutputArrayType add_array_to_array(const size_t _size,
6577
OutputArrayType* _parent) const noexcept {
@@ -154,8 +166,12 @@ class Writer {
154166
using Type = std::remove_cvref_t<decltype(_parent)>;
155167
if constexpr (std::is_same<Type, bson_array_builder_t*>()) {
156168
bson_array_builder_append_array_builder_end(_parent, _arr->val_);
157-
} else {
169+
} else if constexpr (std::is_same<Tupe, bson_t>()) {
158170
bson_append_array_end(_parent, _arr->val_);
171+
} else if constexpr (std::is_same<Type, IsRoot>()) {
172+
bson_array_builder_build(_arr->val_, doc_);
173+
} else {
174+
static_assert(rfl::always_false_v<Type>, "Unsupported type.");
159175
}
160176
};
161177
std::visit(handle, _arr->parent_);
@@ -166,14 +182,18 @@ class Writer {
166182
using Type = std::remove_cvref_t<decltype(_parent)>;
167183
if constexpr (std::is_same<Type, bson_array_builder_t*>()) {
168184
bson_array_builder_append_document_end(_parent, _arr->val_);
169-
} else {
185+
} else if constexpr (std::is_same<Tupe, bson_t>()) {
170186
bson_append_document_end(_parent, _arr->val_);
187+
} else if constexpr (std::is_same<Type, IsRoot>()) {
188+
doc_ = _obj->val_;
189+
} else {
190+
static_assert(rfl::always_false_v<Type>, "Unsupported type.");
171191
}
172192
};
173193
std::visit(handle, _arr->parent_);
174194
}
175195

176-
public:
196+
private:
177197
bson_t doc_;
178198
};
179199

0 commit comments

Comments
 (0)