diff options
Diffstat (limited to 'src/zencore/compactbinaryjson.cpp')
| -rw-r--r-- | src/zencore/compactbinaryjson.cpp | 128 |
1 files changed, 122 insertions, 6 deletions
diff --git a/src/zencore/compactbinaryjson.cpp b/src/zencore/compactbinaryjson.cpp index 68ed09549..02f22ba4d 100644 --- a/src/zencore/compactbinaryjson.cpp +++ b/src/zencore/compactbinaryjson.cpp @@ -22,7 +22,10 @@ namespace zen { class CbJsonWriter { public: - explicit CbJsonWriter(StringBuilderBase& InBuilder) : Builder(InBuilder) { NewLineAndIndent << LINE_TERMINATOR_ANSI; } + explicit CbJsonWriter(StringBuilderBase& InBuilder, bool AddTypeComment) : Builder(InBuilder), m_AddTypeComment(AddTypeComment) + { + NewLineAndIndent << LINE_TERMINATOR_ANSI; + } void BeginObject() { @@ -74,11 +77,32 @@ public: switch (CbValue Accessor = Field.GetValue(); Accessor.GetType()) { case CbFieldType::Null: + if (m_AddTypeComment) + { + Builder << "[Null] "; + } Builder << "null"sv; break; case CbFieldType::Object: + { + if (m_AddTypeComment) + { + Builder << "[Object] "; + } + BeginObject(); + for (CbFieldView It : Field) + { + WriteField(It); + } + EndObject(); + } + break; case CbFieldType::UniformObject: { + if (m_AddTypeComment) + { + Builder << "[UniformObject] "; + } BeginObject(); for (CbFieldView It : Field) { @@ -88,8 +112,25 @@ public: } break; case CbFieldType::Array: + { + if (m_AddTypeComment) + { + Builder << "[Array] "; + } + BeginArray(); + for (CbFieldView It : Field) + { + WriteField(It); + } + EndArray(); + } + break; case CbFieldType::UniformArray: { + if (m_AddTypeComment) + { + Builder << "[UniformArray] "; + } BeginArray(); for (CbFieldView It : Field) { @@ -99,19 +140,39 @@ public: } break; case CbFieldType::Binary: + if (m_AddTypeComment) + { + Builder << "[Binary] "; + } AppendBase64String(Accessor.AsBinary()); break; case CbFieldType::String: + if (m_AddTypeComment) + { + Builder << "[String] "; + } AppendQuotedString(Accessor.AsU8String()); break; case CbFieldType::IntegerPositive: + if (m_AddTypeComment) + { + Builder << "[IntegerPositive] "; + } Builder << Accessor.AsIntegerPositive(); break; case CbFieldType::IntegerNegative: + if (m_AddTypeComment) + { + Builder << "[IntegerNegative] "; + } Builder << Accessor.AsIntegerNegative(); break; case CbFieldType::Float32: { + if (m_AddTypeComment) + { + Builder << "[Float32] "; + } const float Value = Accessor.AsFloat32(); if (std::isfinite(Value)) { @@ -125,6 +186,10 @@ public: break; case CbFieldType::Float64: { + if (m_AddTypeComment) + { + Builder << "[Float64] "; + } const double Value = Accessor.AsFloat64(); if (std::isfinite(Value)) { @@ -137,14 +202,36 @@ public: } break; case CbFieldType::BoolFalse: + if (m_AddTypeComment) + { + Builder << "[BoolFalse] "; + } Builder << "false"sv; break; case CbFieldType::BoolTrue: + if (m_AddTypeComment) + { + Builder << "[BoolTrue] "; + } Builder << "true"sv; break; case CbFieldType::ObjectAttachment: + { + if (m_AddTypeComment) + { + Builder << "[ObjectAttachment] "; + } + Builder << '"'; + Accessor.AsAttachment().ToHexString(Builder); + Builder << '"'; + } + break; case CbFieldType::BinaryAttachment: { + if (m_AddTypeComment) + { + Builder << "[BinaryAttachment] "; + } Builder << '"'; Accessor.AsAttachment().ToHexString(Builder); Builder << '"'; @@ -152,6 +239,10 @@ public: break; case CbFieldType::Hash: { + if (m_AddTypeComment) + { + Builder << "[Hash] "; + } Builder << '"'; Accessor.AsHash().ToHexString(Builder); Builder << '"'; @@ -159,16 +250,28 @@ public: break; case CbFieldType::Uuid: { + if (m_AddTypeComment) + { + Builder << "[Uuid] "; + } Builder << '"'; Accessor.AsUuid().ToString(Builder); Builder << '"'; } break; case CbFieldType::DateTime: + if (m_AddTypeComment) + { + Builder << "[DateTime] "; + } Builder << '"' << DateTime(Accessor.AsDateTimeTicks()).ToIso8601() << '"'; break; case CbFieldType::TimeSpan: { + if (m_AddTypeComment) + { + Builder << "[TimeSpan] "; + } const TimeSpan Span(Accessor.AsTimeSpanTicks()); if (Span.GetDays() == 0) { @@ -181,12 +284,20 @@ public: break; } case CbFieldType::ObjectId: + if (m_AddTypeComment) + { + Builder << "[ObjectId] "; + } Builder << '"'; Accessor.AsObjectId().ToString(Builder); Builder << '"'; break; case CbFieldType::CustomById: { + if (m_AddTypeComment) + { + Builder << "[CustomById] "; + } CbCustomById Custom = Accessor.AsCustomById(); Builder << "{ \"Id\": "; Builder << Custom.Id; @@ -197,6 +308,10 @@ public: } case CbFieldType::CustomByName: { + if (m_AddTypeComment) + { + Builder << "[CustomByName] "; + } CbCustomByName Custom = Accessor.AsCustomByName(); Builder << "{ \"Name\": "; AppendQuotedString(Custom.Name); @@ -299,29 +414,30 @@ private: private: StringBuilderBase& Builder; ExtendableStringBuilder<32> NewLineAndIndent; + const bool m_AddTypeComment; bool NeedsComma{false}; bool NeedsNewLine{false}; }; void -CompactBinaryToJson(const CbObjectView& Object, StringBuilderBase& Builder) +CompactBinaryToJson(const CbObjectView& Object, StringBuilderBase& Builder, bool AddTypeComment) { - CbJsonWriter Writer(Builder); + CbJsonWriter Writer(Builder, AddTypeComment); Writer.WriteField(Object.AsFieldView()); } void CompactBinaryToJson(const CbArrayView& Array, StringBuilderBase& Builder) { - CbJsonWriter Writer(Builder); + CbJsonWriter Writer(Builder, /*AddTypeComment*/ false); Writer.WriteField(Array.AsFieldView()); } void -CompactBinaryToJson(MemoryView Data, StringBuilderBase& InBuilder) +CompactBinaryToJson(MemoryView Data, StringBuilderBase& InBuilder, bool AddTypeComment) { std::vector<CbFieldView> Fields = ReadCompactBinaryStream(Data); - CbJsonWriter Writer(InBuilder); + CbJsonWriter Writer(InBuilder, AddTypeComment); if (!Fields.empty()) { if (Fields.size() == 1) |