ToStringVisitor settings to allow pretty formatted JSON (#4933)

This commit is contained in:
Michael Edwards
2018-09-24 18:29:49 +02:00
committed by Wouter van Oortmerssen
parent 33791dc7b0
commit b1a925dfc2
2 changed files with 71 additions and 6 deletions

View File

@@ -284,14 +284,27 @@ inline void IterateFlatBuffer(const uint8_t *buffer,
struct ToStringVisitor : public IterationVisitor { struct ToStringVisitor : public IterationVisitor {
std::string s; std::string s;
std::string d; std::string d;
ToStringVisitor(std::string delimiter): d(delimiter) {} bool q;
std::string in;
size_t indent_level;
ToStringVisitor(std::string delimiter, bool quotes, std::string indent)
: d(delimiter), q(quotes), in(indent), indent_level(0) {}
ToStringVisitor(std::string delimiter)
: d(delimiter), q(false), in(""), indent_level(0) {}
void append_indent() {
for (size_t i = 0; i < indent_level; i++) { s += in; }
}
void StartSequence() { void StartSequence() {
s += "{"; s += "{";
s += d; s += d;
indent_level++;
} }
void EndSequence() { void EndSequence() {
s += d; s += d;
indent_level--;
append_indent();
s += "}"; s += "}";
} }
void Field(size_t /*field_idx*/, size_t set_idx, ElementaryType /*type*/, void Field(size_t /*field_idx*/, size_t set_idx, ElementaryType /*type*/,
@@ -302,16 +315,22 @@ struct ToStringVisitor : public IterationVisitor {
s += ","; s += ",";
s += d; s += d;
} }
append_indent();
if (name) { if (name) {
if (q) s += "\"";
s += name; s += name;
if (q) s += "\"";
s += ": "; s += ": ";
} }
} }
template<typename T> void Named(T x, const char *name) { template<typename T> void Named(T x, const char *name) {
if (name) if (name) {
if (q) s += "\"";
s += name; s += name;
else if (q) s += "\"";
} else {
s += NumToString(x); s += NumToString(x);
}
} }
void UType(uint8_t x, const char *name) { Named(x, name); } void UType(uint8_t x, const char *name) { Named(x, name); }
void Bool(bool x) { s += x ? "true" : "false"; } void Bool(bool x) { s += x ? "true" : "false"; }
@@ -329,11 +348,25 @@ struct ToStringVisitor : public IterationVisitor {
EscapeString(str->c_str(), str->size(), &s, true, false); EscapeString(str->c_str(), str->size(), &s, true, false);
} }
void Unknown(const uint8_t *) { s += "(?)"; } void Unknown(const uint8_t *) { s += "(?)"; }
void StartVector() { s += "[ "; } void StartVector() {
void EndVector() { s += " ]"; } s += "[";
s += d;
indent_level++;
append_indent();
}
void EndVector() {
s += d;
indent_level--;
append_indent();
s += "]";
}
void Element(size_t i, ElementaryType /*type*/, void Element(size_t i, ElementaryType /*type*/,
const TypeTable * /*type_table*/, const uint8_t * /*val*/) { const TypeTable * /*type_table*/, const uint8_t * /*val*/) {
if (i) s += ", "; if (i) {
s += ",";
s += d;
append_indent();
}
} }
}; };

View File

@@ -1727,6 +1727,38 @@ void UnionVectorTest() {
"characters_type: [ Belle, MuLan, BookFan, Other, Unused ], " "characters_type: [ Belle, MuLan, BookFan, Other, Unused ], "
"characters: [ { books_read: 7 }, { sword_attack_damage: 5 }, " "characters: [ { books_read: 7 }, { sword_attack_damage: 5 }, "
"{ books_read: 2 }, \"Other\", \"Unused\" ] }"); "{ books_read: 2 }, \"Other\", \"Unused\" ] }");
flatbuffers::ToStringVisitor visitor("\n", true, " ");
IterateFlatBuffer(fbb.GetBufferPointer(), MovieTypeTable(), &visitor);
TEST_EQ_STR(
visitor.s.c_str(),
"{\n"
" \"main_character_type\": \"Rapunzel\",\n"
" \"main_character\": {\n"
" \"hair_length\": 6\n"
" },\n"
" \"characters_type\": [\n"
" \"Belle\",\n"
" \"MuLan\",\n"
" \"BookFan\",\n"
" \"Other\",\n"
" \"Unused\"\n"
" ],\n"
" \"characters\": [\n"
" {\n"
" \"books_read\": 7\n"
" },\n"
" {\n"
" \"sword_attack_damage\": 5\n"
" },\n"
" {\n"
" \"books_read\": 2\n"
" },\n"
" \"Other\",\n"
" \"Unused\"\n"
" ]\n"
"}");
} }
void ConformTest() { void ConformTest() {