in codegen/src/Azure.Iot.Operations.ProtocolCompiler/TypeGenerator/JsonSchemaStandardizer.cs [52:98]
public void CollateSchemaTypes(JsonElement rootElt, JsonElement schemaElt, string? internalDefsKey, string schemaFilePath, CodeName genNamespace, List<SchemaType> schemaTypes)
{
string? title = schemaElt.GetProperty("title").GetString();
if (string.IsNullOrEmpty(title))
{
throw new InvalidOperationException($"The 'title' property is missing or empty in the schema at {schemaFilePath}.");
}
CodeName schemaName = new CodeName((char.IsNumber(title[0]) ? "_" : "") + Regex.Replace(title, "[^a-zA-Z0-9]+", "_", RegexOptions.CultureInvariant));
string? description = schemaElt.TryGetProperty("description", out JsonElement descElt) ? descElt.GetString() : null;
if (schemaElt.TryGetProperty("properties", out JsonElement propertiesElt) && schemaElt.GetProperty("type").GetString() == "object")
{
HashSet<string> requiredFields = schemaElt.TryGetProperty("required", out JsonElement requiredElt) ? requiredElt.EnumerateArray().Select(e => e.GetString()!).ToHashSet() : new HashSet<string>();
schemaTypes.Add(new ObjectType(
schemaName,
genNamespace,
description,
propertiesElt.EnumerateObject().ToDictionary(p => new CodeName(p.Name), p => GetObjectTypeFieldInfo(rootElt, p.Name, p.Value, internalDefsKey, requiredFields, schemaFilePath, genNamespace))));
}
else if (schemaElt.TryGetProperty("enum", out JsonElement enumElt))
{
switch (schemaElt.GetProperty("type").GetString())
{
case "integer":
schemaTypes.Add(new EnumType(
schemaName,
genNamespace,
description,
names: schemaElt.GetProperty("x-enumNames").EnumerateArray().Select(e => new CodeName(e.GetString()!)).ToArray(),
intValues: enumElt.EnumerateArray().Select(e => e.GetInt32()).ToArray()));
break;
case "string":
string[] stringValues = enumElt.EnumerateArray().Select(e => e.GetString()!).ToArray();
CodeName[] enumNames = schemaElt.TryGetProperty("x-enumNames", out JsonElement enumNameElt) ?
enumNameElt.EnumerateArray().Select(e => new CodeName(e.GetString()!)).ToArray() :
stringValues.Select(v => new CodeName(v)).ToArray();
schemaTypes.Add(new EnumType(
schemaName,
genNamespace,
description,
names: enumNames,
stringValues: stringValues));
break;
}
}
}