xrpld
Loading...
Searching...
No Matches
json_writer.h
1#pragma once
2
3#include <xrpl/json/json_forwards.h>
4#include <xrpl/json/json_value.h>
5
6#include <ostream>
7#include <vector>
8
9namespace json {
10
11class Value;
12
16{
17public:
18 virtual ~WriterBase() = default;
19 virtual std::string
20 write(Value const& root) = 0;
21};
22
30
31class FastWriter : public WriterBase
32{
33public:
34 FastWriter() = default;
35 ~FastWriter() override = default;
36
37public: // overridden from Writer
39 write(Value const& root) override;
40
41private:
42 void
43 writeValue(Value const& value);
44
46};
47
67{
68public:
70 ~StyledWriter() override = default;
71
72public: // overridden from Writer
78 write(Value const& root) override;
79
80private:
81 void
82 writeValue(Value const& value);
83 void
84 writeArrayValue(Value const& value);
85 bool
86 isMultilineArray(Value const& value);
87 void
88 pushValue(std::string const& value);
89 void
91 void
92 writeWithIndent(std::string const& value);
93 void
94 indent();
95 void
96 unindent();
97
99
106};
107
130{
131public:
132 StyledStreamWriter(std::string indentation = "\t");
134
135public:
142 void
143 write(std::ostream& out, Value const& root);
144
145private:
146 void
147 writeValue(Value const& value);
148 void
149 writeArrayValue(Value const& value);
150 bool
151 isMultilineArray(Value const& value);
152 void
153 pushValue(std::string const& value);
154 void
155 writeIndent();
156 void
157 writeWithIndent(std::string const& value);
158 void
159 indent();
160 void
161 unindent();
162
164
171};
172
174valueToString(Int value);
176valueToString(UInt value);
178valueToString(double value);
180valueToString(bool value);
182valueToQuotedString(char const* value);
183
187operator<<(std::ostream&, Value const& root);
188
189//------------------------------------------------------------------------------
190
191// Helpers for stream
192namespace detail {
193
194template <class Write>
195void
196writeString(Write const& write, std::string const& s)
197{
198 write(s.data(), s.size());
199}
200
201template <class Write>
202void
203writeValue(Write const& write, Value const& value)
204{
205 switch (value.type())
206 {
207 case ValueType::Null:
208 write("null", 4);
209 break;
210
211 case ValueType::Int:
212 writeString(write, valueToString(value.asInt()));
213 break;
214
215 case ValueType::UInt:
216 writeString(write, valueToString(value.asUInt()));
217 break;
218
219 case ValueType::Real:
220 writeString(write, valueToString(value.asDouble()));
221 break;
222
224 writeString(write, valueToQuotedString(value.asCString()));
225 break;
226
228 writeString(write, valueToString(value.asBool()));
229 break;
230
231 case ValueType::Array: {
232 write("[", 1);
233 int const size = value.size();
234 for (int index = 0; index < size; ++index)
235 {
236 if (index > 0)
237 write(",", 1);
238 writeValue(write, value[index]);
239 }
240 write("]", 1);
241 break;
242 }
243
244 case ValueType::Object: {
245 Value::Members const members = value.getMemberNames();
246 write("{", 1);
247 for (auto it = members.begin(); it != members.end(); ++it)
248 {
249 std::string const& name = *it;
250 if (it != members.begin())
251 write(",", 1);
252
253 writeString(write, valueToQuotedString(name.c_str()));
254 write(":", 1);
255 writeValue(write, value[name]);
256 }
257 write("}", 1);
258 break;
259 }
260 }
261}
262
263} // namespace detail
264
271template <class Write>
272void
273stream(json::Value const& jv, Write const& write)
274{
275 detail::writeValue(write, jv);
276 write("\n", 1);
277}
278
290{
292
293public:
302 Compact(json::Value&& jv) : jv_{std::move(jv)}
303 {
304 }
305
307 operator<<(std::ostream& o, Compact const& cJv)
308 {
310 [&o](void const* data, std::size_t n) { o.write(static_cast<char const*>(data), n); },
311 cJv.jv_);
312 return o;
313 }
314};
315
316} // namespace json
T begin(T... args)
T c_str(T... args)
friend std::ostream & operator<<(std::ostream &o, Compact const &cJv)
json::Value jv_
Compact(json::Value &&jv)
Wrap a json::Value for compact streaming.
void writeValue(Value const &value)
FastWriter()=default
std::string write(Value const &root) override
std::string document_
Definition json_writer.h:45
~FastWriter() override=default
void pushValue(std::string const &value)
void writeArrayValue(Value const &value)
std::ostream * document_
void write(std::ostream &out, Value const &root)
Serialize a Value in JSON format.
void writeValue(Value const &value)
bool isMultilineArray(Value const &value)
StyledStreamWriter(std::string indentation="\t")
void writeWithIndent(std::string const &value)
std::vector< std::string > ChildValues
void pushValue(std::string const &value)
ChildValues childValues_
bool isMultilineArray(Value const &value)
std::string write(Value const &root) override
Serialize a Value in JSON format.
std::string indentString_
void writeValue(Value const &value)
void writeWithIndent(std::string const &value)
std::vector< std::string > ChildValues
Definition json_writer.h:98
void writeArrayValue(Value const &value)
std::string document_
~StyledWriter() override=default
Represents a JSON value.
Definition json_value.h:130
std::vector< std::string > Members
Definition json_value.h:134
Abstract class for writers.
Definition json_writer.h:16
virtual std::string write(Value const &root)=0
virtual ~WriterBase()=default
T data(T... args)
T end(T... args)
void writeString(Write const &write, std::string const &s)
void writeValue(Write const &write, Value const &value)
JSON (JavaScript Object Notation).
Definition json_errors.h:5
int Int
std::string valueToQuotedString(char const *value)
void stream(json::Value const &jv, Write const &write)
Stream compact JSON to the specified function.
unsigned int UInt
@ UInt
unsigned integer value
Definition json_value.h:21
@ Int
signed integer value
Definition json_value.h:20
@ String
UTF-8 string value.
Definition json_value.h:23
@ Boolean
bool value
Definition json_value.h:24
@ Array
array value (ordered list)
Definition json_value.h:25
@ Object
object value (collection of name/value pairs).
Definition json_value.h:26
@ Real
double value
Definition json_value.h:22
@ Null
'null' value
Definition json_value.h:19
std::ostream & operator<<(std::ostream &, Value const &root)
Output using the StyledStreamWriter.
std::string valueToString(Int value)
STL namespace.
T size(T... args)
T write(T... args)