aboutsummaryrefslogtreecommitdiff
path: root/src/zencore/compactbinaryjson.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/zencore/compactbinaryjson.cpp')
-rw-r--r--src/zencore/compactbinaryjson.cpp128
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)