#pragma once
#include "json.h"
namespace json {
class Builder {
public:
Builder() {
nodes_stack_.push_back(&root_);
}
Builder& Value(Node node) {
if (nodes_stack_.back()->IsArray()) {
Array arr = nodes_stack_.back()->AsArray();
arr.emplace_back(node);
*nodes_stack_.back() = arr;
return *this;
} else if (nodes_stack_.back()->IsDict()) {
Dict dict = nodes_stack_.back()->AsDict();
dict[last_key_] = node;
last_key_.clear();
*nodes_stack_.back() = dict;
return *this;
}
*(nodes_stack_.back()) = node;
return *this;
}
Builder& Key(std::string key) {
last_key_ = key;
return *this;
}
Builder& StartDict() {
Dict dict;
*nodes_stack_.back() =
*nodes_stack_.back() = Dict{};
nodes_stack_.push_back(&(*nodes_stack_.back()));
return *this;
}
Builder& EndDict() {
nodes_stack_.pop_back();
return *this;
}
Builder& StartArray() {
*nodes_stack_.back() = Array{};
nodes_stack_.push_back(&(*nodes_stack_.back()));
return *this;
}
Builder& EndArray() {
nodes_stack_.pop_back();
return *this;
}
Node&& Build() {
return std::move(root_);
}
private:
Node root_;
std::vector<Node*> nodes_stack_;
std::string last_key_;
};
} // namespace json