diff options
Diffstat (limited to 'source/compiler-core/slang-json-native.cpp')
| -rw-r--r-- | source/compiler-core/slang-json-native.cpp | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/source/compiler-core/slang-json-native.cpp b/source/compiler-core/slang-json-native.cpp index 1f9a4dbc6..930aa611f 100644 --- a/source/compiler-core/slang-json-native.cpp +++ b/source/compiler-core/slang-json-native.cpp @@ -205,6 +205,22 @@ SlangResult JSONToNativeConverter::convert(const JSONValue& in, const RttiInfo* *(UnownedStringSlice*)out = m_container->getString(in); return SLANG_OK; } + case RttiInfo::Kind::Optional: + { + if (in.getKind() == JSONValue::Kind::Null) + { + return SLANG_OK; + } + typedef List<Byte> Type; + const OptionalRttiInfo* optionalRttiInfo = + static_cast<const OptionalRttiInfo*>(rttiInfo); + auto hasValue = (uint8_t*)out; + *hasValue = 1; + return convert( + in, + optionalRttiInfo->m_elementType, + (uint8_t*)out + optionalRttiInfo->m_valueOffset); + } case RttiInfo::Kind::List: { if (in.getKind() == JSONValue::Kind::Null) @@ -441,6 +457,24 @@ SlangResult NativeToJSONConverter::convert(const RttiInfo* rttiInfo, const void* { return SLANG_E_NOT_IMPLEMENTED; } + case RttiInfo::Kind::Optional: + { + const OptionalRttiInfo* optionalRttiInfo = + static_cast<const OptionalRttiInfo*>(rttiInfo); + auto hasValue = (const uint8_t*)in; + if (*hasValue) + { + return convert( + optionalRttiInfo->m_elementType, + (const uint8_t*)in + optionalRttiInfo->m_valueOffset, + out); + } + else + { + out = JSONValue::makeNull(); + return SLANG_OK; + } + } case RttiInfo::Kind::List: { const ListRttiInfo* listRttiInfo = static_cast<const ListRttiInfo*>(rttiInfo); |
