7 using json = nlohmann::json;
13 using std::literals::string_literals::operator
""s;
17 explicit JsonWriter(std::ostream& stream) : stream(stream) {}
24 stream <<
", " << std::endl;
29 if (strlen(meta.name) > 0)
30 stream << quote(meta.name) <<
": ";
40 throw std::runtime_error(
"expected array or object");
43 stack.emplace_back(0);
44 graph.emplace_back(meta.type);
54 throw std::invalid_argument(
"begin(meta) not called");
61 if (strlen(meta.name) > 0)
62 stream << quote(meta.name) <<
": ";
64 if constexpr (is_puppable<T>() &&
sizeof(T) > 4) {
65 stream <<
'"' << value <<
'"';
74 static std::string quote(
const std::string& s);
77 std::vector<uint16_t> stack {};
78 std::vector<pupene::Meta::Type> graph {};
87 friend std::ostream& operator<<(std::ostream& out,
95 throw std::invalid_argument(
"must be Array or Object");
97 const auto child = resolve_child(meta);
98 state.emplace_back(JsonState{child, meta, 0});
105 template <
typename T,
111 T t = state.back().dom->at(meta.name);
114 auto& next = state.back();
115 T t = next.dom->begin()[next.idx++];;
128 std::vector<JsonState> state;
130 bool parent_is(
Meta::
Type type)
const;
131 const json* resolve_child(
const Meta& meta);
134 std::ostream& operator<<(std::ostream& out,
void pup(T &value, const Meta &meta)
JsonReader(std::istream &in)
pup object using its component pup functions
PupPolicy begin(T &, const Meta &meta)
~JsonWriter() override=default
JsonWriter(std::ostream &stream)
void pup(T &value, const Meta &meta)
PupPolicy
Controls an object's pup() behavior.
PupPolicy begin(T &, const Meta &meta)
~JsonReader() override=default