in doc-architect/doc-architect-core/src/main/java/com/docarchitect/core/scanner/impl/schema/AvroSchemaScanner.java [312:350]
private String parseFieldType(JsonNode typeNode) {
if (typeNode.isTextual()) {
return typeNode.asText();
}
if (typeNode.isArray()) {
// Union type - extract non-null type
for (JsonNode unionType : typeNode) {
String typeName = unionType.isTextual() ? unionType.asText() : TYPE_COMPLEX;
if (!TYPE_NULL.equals(typeName)) {
return typeName;
}
}
return TYPE_NULL;
}
if (typeNode.isObject()) {
if (typeNode.has(FIELD_TYPE)) {
String type = typeNode.get(FIELD_TYPE).asText();
// Handle complex types
return switch (type) {
case TYPE_ARRAY -> typeNode.has(FIELD_ITEMS) ?
TYPE_ARRAY + "<" + parseFieldType(typeNode.get(FIELD_ITEMS)) + ">" : TYPE_ARRAY;
case TYPE_MAP -> typeNode.has(FIELD_VALUES) ?
TYPE_MAP + "<" + parseFieldType(typeNode.get(FIELD_VALUES)) + ">" : TYPE_MAP;
case TYPE_RECORD -> typeNode.has(FIELD_NAME) ?
typeNode.get(FIELD_NAME).asText() : TYPE_RECORD;
case TYPE_ENUM -> typeNode.has(FIELD_NAME) ?
typeNode.get(FIELD_NAME).asText() : TYPE_ENUM;
case TYPE_FIXED -> typeNode.has(FIELD_NAME) ?
typeNode.get(FIELD_NAME).asText() : TYPE_FIXED;
default -> type;
};
}
}
return TYPE_UNKNOWN;
}