Add pointer if struct is optional
This commit is contained in:
parent
e1d654c3ba
commit
4677a978a1
1 changed files with 24 additions and 11 deletions
|
@ -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 {
|
||||||
|
|
Loading…
Reference in a new issue