Add pointer if struct is optional

This commit is contained in:
Simon Ser 2022-10-06 19:39:34 +02:00
parent e1d654c3ba
commit 4677a978a1

View file

@ -86,7 +86,7 @@ func generateStruct(schema *jsonschema.Schema, root *jsonschema.Schema) jen.Code
for name, prop := range schema.Properties { for name, prop := range schema.Properties {
id := formatId(name) id := formatId(name)
required := isRequired(schema, name) required := isRequired(schema, name)
t := generateSchemaType(&prop, root) t := generateSchemaType(&prop, root, required)
jsonTag := name jsonTag := name
if !required { if !required {
jsonTag += ",omitempty" jsonTag += ",omitempty"
@ -107,23 +107,32 @@ func singlePatternProp(schema *jsonschema.Schema) *jsonschema.Schema {
return nil return nil
} }
func generateSchemaType(schema *jsonschema.Schema, root *jsonschema.Schema) jen.Code { func noAdditionalProps(schema *jsonschema.Schema) bool {
return schema.AdditionalProperties != nil && schema.AdditionalProperties.IsFalse()
}
func generateSchemaType(schema *jsonschema.Schema, root *jsonschema.Schema, required bool) jen.Code {
if schema == nil { if schema == nil {
return jen.Interface() return jen.Interface()
} }
if refName := refName(schema.Ref); refName != "" { refName := refName(schema.Ref)
return jen.Id(formatId(refName)) if refName != "" {
schema = resolveRef(schema, root)
t := jen.Id(formatId(refName))
if !required && schemaType(schema) == jsonschema.TypeObject && noAdditionalProps(schema) && len(schema.PatternProperties) == 0 {
t = jen.Op("*").Add(t)
}
return t
} }
schema = resolveRef(schema, root)
switch schemaType(schema) { switch schemaType(schema) {
case jsonschema.TypeNull: case jsonschema.TypeNull:
return jen.Struct() return jen.Struct()
case jsonschema.TypeBoolean: case jsonschema.TypeBoolean:
return jen.Bool() return jen.Bool()
case jsonschema.TypeArray: case jsonschema.TypeArray:
return jen.Index().Add(generateSchemaType(schema.Items, root)) return jen.Index().Add(generateSchemaType(schema.Items, root, required))
case jsonschema.TypeNumber: case jsonschema.TypeNumber:
return jen.Float64() return jen.Float64()
case jsonschema.TypeString: case jsonschema.TypeString:
@ -131,13 +140,17 @@ func generateSchemaType(schema *jsonschema.Schema, root *jsonschema.Schema) jen.
case jsonschema.TypeInteger: case jsonschema.TypeInteger:
return jen.Int64() return jen.Int64()
case jsonschema.TypeObject: case jsonschema.TypeObject:
noAdditionalProps := schema.AdditionalProperties != nil && schema.AdditionalProperties.IsFalse() noAdditionalProps := noAdditionalProps(schema)
if noAdditionalProps && len(schema.PatternProperties) == 0 { if noAdditionalProps && len(schema.PatternProperties) == 0 {
return generateStruct(schema, root) t := generateStruct(schema, root)
if !required {
t = jen.Op("*").Add(t)
}
return t
} else if patternProp := singlePatternProp(schema); noAdditionalProps && patternProp != nil { } else if patternProp := singlePatternProp(schema); noAdditionalProps && patternProp != nil {
return jen.Map(jen.String()).Add(generateSchemaType(patternProp, root)) return jen.Map(jen.String()).Add(generateSchemaType(patternProp, root, true))
} else { } else {
return jen.Map(jen.String()).Add(generateSchemaType(schema.AdditionalProperties, root)) return jen.Map(jen.String()).Add(generateSchemaType(schema.AdditionalProperties, root, true))
} }
default: default:
return jen.Interface() return jen.Interface()
@ -145,7 +158,7 @@ func generateSchemaType(schema *jsonschema.Schema, root *jsonschema.Schema) jen.
} }
func generateDef(def *jsonschema.Schema, root *jsonschema.Schema, f *jen.File, name string) { func generateDef(def *jsonschema.Schema, root *jsonschema.Schema, f *jen.File, name string) {
f.Type().Id(formatId(name)).Add(generateSchemaType(def, root)).Line() f.Type().Id(formatId(name)).Add(generateSchemaType(def, root, true)).Line()
} }
func loadSchema(filename string) *jsonschema.Schema { func loadSchema(filename string) *jsonschema.Schema {