private static string GetListTypeSerialization(FieldDefinition.ListTypeRef listType, string schemaObjectName, string fieldName, string fieldId, TypeDescription parentType, Bundle bundle) { return($@"for (const {Types.GetTypeDisplayName(listType.InnerType, bundle, parentType)}& Element : {fieldName}) {{ {Text.Indent(1, GetValueTypeSerialization(listType.InnerType, schemaObjectName, "Element", fieldId))} }}"); }
private static string GetListTypeDeserialization(FieldDefinition.ListTypeRef listType, string schemaObjectName, string targetObjectName, string fieldName, string fieldId, TypeDescription parentType, Bundle bundle, bool wrapInBlock = false, bool targetIsOption = false) { var listInnerTypeName = Types.GetTypeDisplayName(listType.InnerType, bundle, parentType); var listName = $"{Text.SnakeCaseToPascalCase(fieldName)}List"; var deserializationText = ""; switch (listType.InnerType.ValueTypeSelector) { case ValueType.Primitive: deserializationText = GetPrimitiveListDeserialization(listType.InnerType.Primitive, schemaObjectName, targetObjectName, fieldName, fieldId, bundle, targetIsOption); break; case ValueType.Type: deserializationText = $@"auto ListLength = Schema_GetObjectCount({schemaObjectName}, {fieldId}); {Types.CollectionTypesToQualifiedTypes[Types.Collection.List]}<{listInnerTypeName}> {listName}; {listName}.SetNum(ListLength); for (uint32 i = 0; i < ListLength; ++i) {{ {Text.Indent(1, $"{listName}[i] = {listInnerTypeName}::Deserialize(Schema_IndexObject({schemaObjectName}, {fieldId}, i));")} }} {targetObjectName} = {listName};"; break; case ValueType.Enum: deserializationText = $@"auto ListLength = Schema_GetEnumCount({schemaObjectName}, {fieldId}); {Types.CollectionTypesToQualifiedTypes[Types.Collection.List]}<{listInnerTypeName}> {listName}; {listName}.SetNum(ListLength); for (uint32 i = 0; i < ListLength; ++i) {{ {Text.Indent(1, $"{listName}[i] = static_cast<{listInnerTypeName}>(Schema_IndexEnum({schemaObjectName}, {fieldId}, i));")} }} {targetObjectName} = {listName};"; break; default: throw new InvalidOperationException("Trying to deserialize invalid TypeReference"); } return(wrapInBlock ? $"{{{Environment.NewLine}{Text.Indent(1, deserializationText)}{Environment.NewLine}}}" : deserializationText); }