[ox/oc] Fix OC not dealing with certain int types properly
All checks were successful
Build / build (push) Successful in 2m33s
All checks were successful
Build / build (push) Successful in 2m33s
This commit is contained in:
parent
7d8a8e0e52
commit
c021e5e7fb
129
deps/ox/src/ox/oc/read.cpp
vendored
129
deps/ox/src/ox/oc/read.cpp
vendored
@ -36,135 +36,6 @@ OrganicClawReader::OrganicClawReader(Json::Value json, int unionIdx) noexcept:
|
||||
m_unionIdx(unionIdx) {
|
||||
}
|
||||
|
||||
Error OrganicClawReader::field(const char *key, int8_t *val) noexcept {
|
||||
auto err = OxError(0);
|
||||
if (targetValid()) {
|
||||
const auto &jv = value(key);
|
||||
if (jv.empty()) {
|
||||
*val = 0;
|
||||
} else if (jv.isInt()) {
|
||||
*val = static_cast<int8_t>(jv.asInt());
|
||||
} else {
|
||||
err = OxError(1, "Type mismatch");
|
||||
}
|
||||
}
|
||||
++m_fieldIt;
|
||||
return err;
|
||||
}
|
||||
|
||||
Error OrganicClawReader::field(const char *key, int16_t *val) noexcept {
|
||||
auto err = OxError(0);
|
||||
if (targetValid()) {
|
||||
const auto &jv = value(key);
|
||||
if (jv.empty()) {
|
||||
*val = 0;
|
||||
} else if (jv.isInt()) {
|
||||
*val = static_cast<int16_t>(jv.asInt());
|
||||
} else {
|
||||
err = OxError(1, "Type mismatch");
|
||||
}
|
||||
}
|
||||
++m_fieldIt;
|
||||
return err;
|
||||
}
|
||||
|
||||
Error OrganicClawReader::field(const char *key, int32_t *val) noexcept {
|
||||
auto err = OxError(0);
|
||||
if (targetValid()) {
|
||||
const auto &jv = value(key);
|
||||
if (jv.empty()) {
|
||||
*val = 0;
|
||||
} else if (jv.isInt()) {
|
||||
*val = static_cast<int32_t>(jv.asInt());
|
||||
} else {
|
||||
err = OxError(1, "Type mismatch");
|
||||
}
|
||||
}
|
||||
++m_fieldIt;
|
||||
return err;
|
||||
}
|
||||
|
||||
Error OrganicClawReader::field(const char *key, int64_t *val) noexcept {
|
||||
auto err = OxError(0);
|
||||
if (targetValid()) {
|
||||
const auto &jv = value(key);
|
||||
if (jv.empty()) {
|
||||
*val = 0;
|
||||
} else if (jv.isInt() || jv.isInt64()) {
|
||||
*val = static_cast<int64_t>(jv.asInt64());
|
||||
} else {
|
||||
err = OxError(1, "Type mismatch");
|
||||
}
|
||||
}
|
||||
++m_fieldIt;
|
||||
return err;
|
||||
}
|
||||
|
||||
|
||||
Error OrganicClawReader::field(const char *key, uint8_t *val) noexcept {
|
||||
auto err = OxError(0);
|
||||
if (targetValid()) {
|
||||
const auto &jv = value(key);
|
||||
if (jv.empty()) {
|
||||
*val = 0;
|
||||
} else if (jv.isUInt()) {
|
||||
*val = static_cast<uint8_t>(jv.asUInt());
|
||||
} else {
|
||||
err = OxError(1, "Type mismatch");
|
||||
}
|
||||
}
|
||||
++m_fieldIt;
|
||||
return err;
|
||||
}
|
||||
|
||||
Error OrganicClawReader::field(const char *key, uint16_t *val) noexcept {
|
||||
auto err = OxError(0);
|
||||
if (targetValid()) {
|
||||
const auto &jv = value(key);
|
||||
if (jv.empty()) {
|
||||
*val = 0;
|
||||
} else if (jv.isUInt()) {
|
||||
*val = static_cast<uint16_t>(jv.asUInt());
|
||||
} else {
|
||||
err = OxError(1, "Type mismatch");
|
||||
}
|
||||
}
|
||||
++m_fieldIt;
|
||||
return err;
|
||||
}
|
||||
|
||||
Error OrganicClawReader::field(const char *key, uint32_t *val) noexcept {
|
||||
auto err = OxError(0);
|
||||
if (targetValid()) {
|
||||
const auto &jv = value(key);
|
||||
if (jv.empty()) {
|
||||
*val = 0;
|
||||
} else if (jv.isUInt()) {
|
||||
*val = static_cast<uint32_t>(jv.asUInt());
|
||||
} else {
|
||||
err = OxError(1, "Type mismatch");
|
||||
}
|
||||
}
|
||||
++m_fieldIt;
|
||||
return err;
|
||||
}
|
||||
|
||||
Error OrganicClawReader::field(const char *key, uint64_t *val) noexcept {
|
||||
auto err = OxError(0);
|
||||
if (targetValid()) {
|
||||
const auto &jv = value(key);
|
||||
if (jv.empty()) {
|
||||
*val = 0;
|
||||
} else if (jv.isUInt() || jv.isUInt64()) {
|
||||
*val = static_cast<uint64_t>(jv.asUInt64());
|
||||
} else {
|
||||
err = OxError(1, "Type mismatch");
|
||||
}
|
||||
}
|
||||
++m_fieldIt;
|
||||
return err;
|
||||
}
|
||||
|
||||
Error OrganicClawReader::field(const char *key, bool *val) noexcept {
|
||||
auto err = OxError(0);
|
||||
if (targetValid()) {
|
||||
|
68
deps/ox/src/ox/oc/read.hpp
vendored
68
deps/ox/src/ox/oc/read.hpp
vendored
@ -41,16 +41,6 @@ class OrganicClawReader {
|
||||
|
||||
explicit OrganicClawReader(Json::Value json, int unionIdx = -1) noexcept;
|
||||
|
||||
Error field(const char *key, int8_t *val) noexcept;
|
||||
Error field(const char *key, int16_t *val) noexcept;
|
||||
Error field(const char *key, int32_t *val) noexcept;
|
||||
Error field(const char *key, int64_t *val) noexcept;
|
||||
|
||||
Error field(const char *key, uint8_t *val) noexcept;
|
||||
Error field(const char *key, uint16_t *val) noexcept;
|
||||
Error field(const char *key, uint32_t *val) noexcept;
|
||||
Error field(const char *key, uint64_t *val) noexcept;
|
||||
|
||||
Error field(const char *key, bool *val) noexcept;
|
||||
|
||||
// array handler
|
||||
@ -144,28 +134,46 @@ class OrganicClawReader {
|
||||
template<typename T>
|
||||
Error OrganicClawReader::field(const char *key, T *val) noexcept {
|
||||
auto err = OxError(0);
|
||||
if constexpr(isVector_v<T>) {
|
||||
const auto &srcVal = value(key);
|
||||
const auto srcSize = srcVal.size();
|
||||
oxReturnError(ox::resizeVector(*val, srcSize));
|
||||
err = field(key, val->data(), val->size());
|
||||
} else if constexpr(isArray_v<T>) {
|
||||
const auto &srcVal = value(key);
|
||||
const auto srcSize = srcVal.size();
|
||||
if (srcSize > val->size()) {
|
||||
err = OxError(1, "Input array is too long");
|
||||
} else {
|
||||
try {
|
||||
if constexpr (is_integer_v<T>) {
|
||||
if (targetValid()) {
|
||||
auto const&jv = value(key);
|
||||
auto const rightType = sizeof(T) == 8 ?
|
||||
(ox::is_signed_v<T> ? jv.isInt64() : jv.isUInt64()) :
|
||||
(ox::is_signed_v<T> ? jv.isInt() : jv.isUInt());
|
||||
if (jv.empty()) {
|
||||
*val = 0;
|
||||
} else if (rightType) {
|
||||
*val = static_cast<T>(jv.asUInt());
|
||||
} else {
|
||||
err = OxError(1, "Type mismatch");
|
||||
}
|
||||
}
|
||||
} else if constexpr (isVector_v<T>) {
|
||||
const auto&srcVal = value(key);
|
||||
const auto srcSize = srcVal.size();
|
||||
oxReturnError(ox::resizeVector(*val, srcSize));
|
||||
err = field(key, val->data(), val->size());
|
||||
} else if constexpr (isArray_v<T>) {
|
||||
const auto&srcVal = value(key);
|
||||
const auto srcSize = srcVal.size();
|
||||
if (srcSize > val->size()) {
|
||||
err = OxError(1, "Input array is too long");
|
||||
} else {
|
||||
err = field(key, val->data(), val->size());
|
||||
}
|
||||
} else if (targetValid()) {
|
||||
const auto&jv = value(key);
|
||||
if (jv.empty() || jv.isObject()) {
|
||||
auto reader = child(key);
|
||||
ModelHandlerInterface handler(&reader);
|
||||
err = model(&handler, val);
|
||||
} else {
|
||||
err = OxError(1, "Type mismatch");
|
||||
}
|
||||
}
|
||||
} else if (targetValid()) {
|
||||
const auto &jv = value(key);
|
||||
if (jv.empty() || jv.isObject()) {
|
||||
auto reader = child(key);
|
||||
ModelHandlerInterface handler(&reader);
|
||||
err = model(&handler, val);
|
||||
} else {
|
||||
err = OxError(1, "Type mismatch");
|
||||
}
|
||||
} catch (Json::LogicError const&) {
|
||||
err = OxError(1, "error reading JSON data");
|
||||
}
|
||||
++m_fieldIt;
|
||||
return err;
|
||||
|
12
deps/ox/src/ox/oc/write.hpp
vendored
12
deps/ox/src/ox/oc/write.hpp
vendored
@ -209,7 +209,17 @@ Error OrganicClawWriter::field(const char *key, const T *val, std::size_t len) n
|
||||
|
||||
template<typename T>
|
||||
Error OrganicClawWriter::field(const char *key, const T *val) noexcept {
|
||||
if constexpr(isVector_v<T> || isArray_v<T>) {
|
||||
if constexpr(is_integer_v<T>) {
|
||||
if (targetValid() && (*val || m_json.isArray())) {
|
||||
// the int type needs to be normalized because jsoncpp doesn't
|
||||
// factor in every permutation unsigned long, etc.
|
||||
if constexpr(ox::is_signed_v<T>) {
|
||||
value(key) = static_cast<ox::Int<8 * sizeof(*val)>>(*val);
|
||||
} else {
|
||||
value(key) = static_cast<ox::Uint<8 * sizeof(*val)>>(*val);
|
||||
}
|
||||
}
|
||||
} else if constexpr(isVector_v<T> || isArray_v<T>) {
|
||||
return field(key, val->data(), val->size());
|
||||
} else if (val && targetValid()) {
|
||||
OrganicClawWriter w;
|
||||
|
Loading…
Reference in New Issue
Block a user