From 6b774ec2856b887fbb7c2fb2f70418cd175f9b8c Mon Sep 17 00:00:00 2001 From: Gary Talent Date: Wed, 27 Dec 2023 23:47:52 -0600 Subject: [PATCH] [ox/oc] Fix array writing to write all values This is necessary because OC array sizes are determined through the presence of the data. --- deps/ox/src/ox/oc/write.hpp | 46 ++++++++++++++++++++++++------------- 1 file changed, 30 insertions(+), 16 deletions(-) diff --git a/deps/ox/src/ox/oc/write.hpp b/deps/ox/src/ox/oc/write.hpp index 77bb8cfc..d0a0aa25 100644 --- a/deps/ox/src/ox/oc/write.hpp +++ b/deps/ox/src/ox/oc/write.hpp @@ -37,7 +37,7 @@ class OrganicClawWriter { explicit OrganicClawWriter(Json::Value json, int unionIdx = -1) noexcept; Error field(const char *key, const int8_t *val) noexcept { - if (*val) { + if (targetValid() && (*val || m_json.isArray())) { value(key) = *val; } ++m_fieldIt; @@ -45,7 +45,7 @@ class OrganicClawWriter { } Error field(const char *key, const int16_t *val) noexcept { - if (*val) { + if (targetValid() && (*val || m_json.isArray())) { value(key) = *val; } ++m_fieldIt; @@ -53,7 +53,7 @@ class OrganicClawWriter { } Error field(const char *key, const int32_t *val) noexcept { - if (*val) { + if (targetValid() && (*val || m_json.isArray())) { value(key) = *val; } ++m_fieldIt; @@ -61,7 +61,7 @@ class OrganicClawWriter { } Error field(const char *key, const int64_t *val) noexcept { - if (*val) { + if (targetValid() && (*val || m_json.isArray())) { value(key) = *val; } ++m_fieldIt; @@ -70,7 +70,7 @@ class OrganicClawWriter { Error field(const char *key, const uint8_t *val) noexcept { - if (*val) { + if (targetValid() && (*val || m_json.isArray())) { value(key) = *val; } ++m_fieldIt; @@ -78,7 +78,7 @@ class OrganicClawWriter { } Error field(const char *key, const uint16_t *val) noexcept { - if (targetValid() && *val) { + if (targetValid() && (*val || m_json.isArray())) { value(key) = *val; } ++m_fieldIt; @@ -86,7 +86,7 @@ class OrganicClawWriter { } Error field(const char *key, const uint32_t *val) noexcept { - if (targetValid() && *val) { + if (targetValid() && (*val || m_json.isArray())) { value(key) = *val; } ++m_fieldIt; @@ -94,15 +94,15 @@ class OrganicClawWriter { } Error field(const char *key, const uint64_t *val) noexcept { - if (targetValid() && *val) { + if (targetValid() && (*val || m_json.isArray())) { value(key) = *val; } ++m_fieldIt; return OxError(0); } - Error field(const char *key, const bool *val) noexcept { - if (targetValid() && *val) { + Error field(char const*key, bool const*val) noexcept { + if (targetValid() && (*val || m_json.isArray())) { value(key) = *val; } ++m_fieldIt; @@ -110,10 +110,10 @@ class OrganicClawWriter { } template - Error field(const char*, UnionView val) noexcept; + Error field(char const*, UnionView val) noexcept; template - Error field(const char *key, const HashMap *val) noexcept { + Error field(char const*key, HashMap const*val) noexcept { if (targetValid()) { const auto &keys = val->keys(); OrganicClawWriter w; @@ -132,7 +132,7 @@ class OrganicClawWriter { } template - Error field(const char *key, const BString *val) noexcept { + Error field(char const*key, BString const*val) noexcept { if (targetValid() && val->len()) { value(key) = val->c_str(); } @@ -141,7 +141,7 @@ class OrganicClawWriter { } template - Error field(const char *key, const BasicString *val) noexcept { + Error field(char const*key, BasicString const*val) noexcept { if (targetValid() && val->len()) { value(key) = val->c_str(); } @@ -199,9 +199,23 @@ Error OrganicClawWriter::field(const char *key, const T *val, std::size_t len) n OrganicClawWriter w((Json::Value(Json::arrayValue))); ModelHandlerInterface handler{&w}; for (std::size_t i = 0; i < len; ++i) { - oxReturnError(handler.field("", &val[i])); + oxReturnError(handler.field({}, &val[i])); + } + if (w.m_json.isNull()) { + if constexpr(is_same_v) { + value(key) = Json::booleanValue; + } else if constexpr(is_integral_v) { + value(key) = Json::intValue; + } else if constexpr(isOxString_v) { + value(key) = Json::stringValue; + } else if constexpr(isArray_v) { + value(key) = Json::arrayValue; + } else { + value(key) = Json::objectValue; + } + } else { + value(key) = w.m_json; } - value(key) = w.m_json; } ++m_fieldIt; return OxError(0);