@@ -35,13 +35,13 @@ func NewJSONSchemaGenerator() *JSONSchemaGenerator {
3535
3636// GenerateJSONSchema returns a JSON Schema object (as a map) for the given message.
3737// It recursively includes referenced custom types.
38- func (gen * JSONSchemaGenerator ) GenerateJSONSchema (name string , msg * spec.Message , allMessages map [string ]spec.Message ) (JSONSchema , error ) {
38+ func (gen * JSONSchemaGenerator ) GenerateJSONSchema (name string , msg * spec.Message , allMessages map [string ]spec.Message , allEnums map [ string ]spec. Enum ) (JSONSchema , error ) {
3939 schema , has := gen .schemas [name ]
4040 if has {
4141 return schema , nil
4242 }
4343
44- schema , err := gen .generateJSONSchema (msg , allMessages )
44+ schema , err := gen .generateJSONSchema (msg , allMessages , allEnums )
4545 if err != nil {
4646 return nil , err
4747 }
@@ -50,7 +50,7 @@ func (gen *JSONSchemaGenerator) GenerateJSONSchema(name string, msg *spec.Messag
5050 return schema , nil
5151}
5252
53- func (gen * JSONSchemaGenerator ) generateJSONSchema (msg * spec.Message , allMessages map [string ]spec.Message ) (JSONSchema , error ) {
53+ func (gen * JSONSchemaGenerator ) generateJSONSchema (msg * spec.Message , allMessages map [string ]spec.Message , allEnums map [ string ]spec. Enum ) (JSONSchema , error ) {
5454 properties := make (map [string ]any )
5555
5656 schema := map [string ]any {
@@ -60,7 +60,7 @@ func (gen *JSONSchemaGenerator) generateJSONSchema(msg *spec.Message, allMessage
6060
6161 requiredFields := []string {}
6262 for _ , field := range msg .Fields {
63- fieldSchema , err := gen .fieldToSchema (field , allMessages )
63+ fieldSchema , err := gen .fieldToSchema (field , allMessages , allEnums )
6464 if err != nil {
6565 return nil , fmt .Errorf ("field %q: %w" , field .Name , err )
6666 }
@@ -80,36 +80,50 @@ func (gen *JSONSchemaGenerator) generateJSONSchema(msg *spec.Message, allMessage
8080}
8181
8282// fieldToSchema generates the JSON Schema for a single field, recursively if needed.
83- func (gen * JSONSchemaGenerator ) fieldToSchema (field spec.Field , allMessages map [string ]spec.Message ) (map [string ]interface {}, error ) {
83+ func (gen * JSONSchemaGenerator ) fieldToSchema (field spec.Field , allMessages map [string ]spec.Message , allEnums map [ string ]spec. Enum ) (map [string ]interface {}, error ) {
8484 var baseSchema map [string ]any
8585
86- switch field .Type {
87- case "string" :
88- baseSchema = map [string ]any {"type" : "string" }
89- case "int" , "int32" , "int64" :
90- baseSchema = map [string ]any {"type" : "integer" }
91- case "float" , "float32" , "float64" :
92- baseSchema = map [string ]any {"type" : "number" }
93- case "bool" :
94- baseSchema = map [string ]any {"type" : "boolean" }
95- case "datetime" :
96- baseSchema = map [string ]any {"type" : "string" , "format" : "date-time" } // RFC3339
97- default :
98- // Custom type - lookup in allMessages
99- msg , ok := allMessages [field .Type ]
100- if ! ok {
101- return nil , fmt .Errorf ("unknown custom type %q" , field .Type )
86+ // Check if it's an enum type
87+ if enum , isEnum := allEnums [field .Type ]; isEnum {
88+ baseSchema = map [string ]any {
89+ "type" : "string" ,
90+ "enum" : enum .Values ,
10291 }
92+ if enum .Description != "" {
93+ baseSchema ["description" ] = enum .Description
94+ }
95+ }
10396
104- // Recursive schema for nested message
105- nestedSchema , err := gen .GenerateJSONSchema (field .Type , & msg , allMessages )
106- if err != nil {
107- return nil , err
97+ // Check primitive types and custom message types
98+ if baseSchema == nil {
99+ switch field .Type {
100+ case "string" :
101+ baseSchema = map [string ]any {"type" : "string" }
102+ case "int" , "int32" , "int64" :
103+ baseSchema = map [string ]any {"type" : "integer" }
104+ case "float" , "float32" , "float64" :
105+ baseSchema = map [string ]any {"type" : "number" }
106+ case "bool" :
107+ baseSchema = map [string ]any {"type" : "boolean" }
108+ case "datetime" :
109+ baseSchema = map [string ]any {"type" : "string" , "format" : "date-time" } // RFC3339
110+ default :
111+ // Custom message type - lookup in allMessages
112+ msg , ok := allMessages [field .Type ]
113+ if ! ok {
114+ return nil , fmt .Errorf ("unknown custom type %q" , field .Type )
115+ }
116+
117+ // Recursive schema for nested message
118+ nestedSchema , err := gen .GenerateJSONSchema (field .Type , & msg , allMessages , allEnums )
119+ if err != nil {
120+ return nil , err
121+ }
122+ baseSchema = nestedSchema
108123 }
109- baseSchema = nestedSchema
110124 }
111125
112- if field .Description != "" {
126+ if field .Description != "" && baseSchema [ "description" ] == nil {
113127 baseSchema ["description" ] = field .Description
114128 }
115129
0 commit comments