Загрузка данных


#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