summaryrefslogtreecommitdiffstats
path: root/source/compiler-core/slang-json-native.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'source/compiler-core/slang-json-native.cpp')
-rw-r--r--source/compiler-core/slang-json-native.cpp34
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);