in codegen/src/Azure.Iot.Operations.ProtocolCompiler/TypeGenerator/AvroSchemaStandardizer.cs [26:84]
private SchemaType GetSchemaType(JsonElement schemaElt, List<SchemaType> schemaTypes, CodeName parentNamespace)
{
if (schemaElt.ValueKind == JsonValueKind.String)
{
return this.TryGetPrimitiveType(schemaElt.GetString(), out SchemaType schemaType) ? schemaType : new ReferenceType(new CodeName(schemaElt.GetString()!), parentNamespace);
}
JsonElement typeElt = schemaElt.GetProperty("type");
if (typeElt.ValueKind == JsonValueKind.Object)
{
return GetSchemaType(typeElt, schemaTypes, parentNamespace);
}
if (schemaElt.TryGetProperty("logicalType", out JsonElement logicalTypeElt))
{
switch (logicalTypeElt.GetString())
{
case "date":
return new DateType();
case "time-millis":
return new TimeType();
case "timestamp-millis":
return new DateTimeType();
}
}
CodeName? schemaName = schemaElt.TryGetProperty("name", out JsonElement nameElt) ? new CodeName(nameElt.GetString()!) : null;
CodeName genNamespace = schemaElt.TryGetProperty("namespace", out JsonElement namespaceElt) && !namespaceElt.GetString()!.Contains('.') ? new CodeName(namespaceElt.GetString()!) : parentNamespace;
if (this.TryGetPrimitiveType(typeElt.GetString(), out SchemaType primitiveType))
{
return primitiveType;
}
switch (typeElt.GetString())
{
case "record":
schemaTypes.Add(new ObjectType(
schemaName!,
genNamespace,
null,
schemaElt.GetProperty("fields").EnumerateArray().ToDictionary(e => new CodeName(e.GetProperty("name").GetString()!), e => GetObjectTypeFieldInfo(e, schemaTypes, genNamespace))));
return new ReferenceType(schemaName!, genNamespace);
case "enum":
schemaTypes.Add(new EnumType(
schemaName!,
genNamespace,
null,
names: schemaElt.GetProperty("symbols").EnumerateArray().Select(e => new CodeName(e.GetString()!)).ToArray()));
return new ReferenceType(schemaName!, genNamespace, isEnum: true);
case "map":
return new MapType(GetSchemaType(schemaElt.GetProperty("values"), schemaTypes, genNamespace));
case "array":
return new ArrayType(GetSchemaType(schemaElt.GetProperty("items"), schemaTypes, genNamespace));
default:
throw new Exception($"Unrecognized schema type: {typeElt.GetString()}");
}
}