summaryrefslogtreecommitdiffstats
path: root/library/cpp/yson/node/node_builder.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'library/cpp/yson/node/node_builder.cpp')
-rw-r--r--library/cpp/yson/node/node_builder.cpp96
1 files changed, 96 insertions, 0 deletions
diff --git a/library/cpp/yson/node/node_builder.cpp b/library/cpp/yson/node/node_builder.cpp
new file mode 100644
index 00000000000..b4431bc77af
--- /dev/null
+++ b/library/cpp/yson/node/node_builder.cpp
@@ -0,0 +1,96 @@
+#include "node_builder.h"
+
+namespace NYT {
+
+////////////////////////////////////////////////////////////////////////////////
+
+TNodeBuilder::TNodeBuilder(TNode* node)
+{
+ Stack_.push(node);
+}
+
+void TNodeBuilder::OnStringScalar(TStringBuf value)
+{
+ AddNode(value, true);
+}
+
+void TNodeBuilder::OnInt64Scalar(i64 value)
+{
+ AddNode(value, true);
+}
+
+void TNodeBuilder::OnUint64Scalar(ui64 value)
+{
+ AddNode(value, true);
+}
+
+void TNodeBuilder::OnDoubleScalar(double value)
+{
+ AddNode(value, true);
+}
+
+void TNodeBuilder::OnBooleanScalar(bool value)
+{
+ AddNode(value, true);
+}
+
+void TNodeBuilder::OnEntity()
+{
+ AddNode(TNode::CreateEntity(), true);
+}
+
+void TNodeBuilder::OnBeginList()
+{
+ AddNode(TNode::CreateList(), false);
+}
+
+void TNodeBuilder::OnListItem()
+{
+ Stack_.push(&Stack_.top()->Add());
+}
+
+void TNodeBuilder::OnEndList()
+{
+ Stack_.pop();
+}
+
+void TNodeBuilder::OnBeginMap()
+{
+ AddNode(TNode::CreateMap(), false);
+}
+
+void TNodeBuilder::OnKeyedItem(TStringBuf key)
+{
+ Stack_.push(&(*Stack_.top())[TString(key)]);
+}
+
+void TNodeBuilder::OnEndMap()
+{
+ Stack_.pop();
+}
+
+void TNodeBuilder::OnBeginAttributes()
+{
+ Stack_.push(&Stack_.top()->Attributes());
+}
+
+void TNodeBuilder::OnEndAttributes()
+{
+ Stack_.pop();
+}
+
+void TNodeBuilder::OnNode(TNode node)
+{
+ AddNode(std::move(node), true);
+}
+
+void TNodeBuilder::AddNode(TNode value, bool pop)
+{
+ Stack_.top()->MoveWithoutAttributes(std::move(value));
+ if (pop)
+ Stack_.pop();
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+} // namespace NYT