private SchemaType GetSchemaType()

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()}");
            }
        }