diff options
Diffstat (limited to 'vendor/github.com/go-swagger/go-swagger/codescan/schema.go')
| -rw-r--r-- | vendor/github.com/go-swagger/go-swagger/codescan/schema.go | 39 |
1 files changed, 29 insertions, 10 deletions
diff --git a/vendor/github.com/go-swagger/go-swagger/codescan/schema.go b/vendor/github.com/go-swagger/go-swagger/codescan/schema.go index 98bdecba6..640ac0830 100644 --- a/vendor/github.com/go-swagger/go-swagger/codescan/schema.go +++ b/vendor/github.com/go-swagger/go-swagger/codescan/schema.go @@ -365,6 +365,10 @@ func (s *schemaBuilder) buildFromType(tpe types.Type, tgt swaggerTypable) error return s.buildFromType(titpe.Underlying(), tgt) } + if titpe.TypeArgs() != nil && titpe.TypeArgs().Len() > 0 { + return s.buildFromType(titpe.Underlying(), tgt) + } + switch utitpe := tpe.Underlying().(type) { case *types.Struct: if decl, ok := s.ctx.FindModel(tio.Pkg().Path(), tio.Name()); ok { @@ -407,7 +411,7 @@ func (s *schemaBuilder) buildFromType(tpe types.Type, tgt swaggerTypable) error } if defaultName, ok := defaultName(cmt); ok { - debugLog(defaultName) + debugLog(defaultName) //nolint:govet return nil } @@ -651,6 +655,12 @@ func (s *schemaBuilder) buildFromInterface(decl *entityDecl, it *types.Interface ps.AddExtension("x-go-name", fld.Name()) } + if s.ctx.app.setXNullableForPointers { + if _, isPointer := fld.Type().(*types.Signature).Results().At(0).Type().(*types.Pointer); isPointer && (ps.Extensions == nil || (ps.Extensions["x-nullable"] == nil && ps.Extensions["x-isnullable"] == nil)) { + ps.AddExtension("x-nullable", true) + } + } + seen[name] = fld.Name() tgt.Properties[name] = ps } @@ -716,7 +726,7 @@ func (s *schemaBuilder) buildFromStruct(decl *entityDecl, st *types.Struct, sche continue } - _, ignore, _, err := parseJSONTag(afld) + _, ignore, _, _, err := parseJSONTag(afld) if err != nil { return err } @@ -816,7 +826,7 @@ func (s *schemaBuilder) buildFromStruct(decl *entityDecl, st *types.Struct, sche continue } - name, ignore, isString, err := parseJSONTag(afld) + name, ignore, isString, omitEmpty, err := parseJSONTag(afld) if err != nil { return err } @@ -853,6 +863,13 @@ func (s *schemaBuilder) buildFromStruct(decl *entityDecl, st *types.Struct, sche addExtension(&ps.VendorExtensible, "x-go-name", fld.Name()) } + if s.ctx.app.setXNullableForPointers { + if _, isPointer := fld.Type().(*types.Pointer); isPointer && !omitEmpty && + (ps.Extensions == nil || (ps.Extensions["x-nullable"] == nil && ps.Extensions["x-isnullable"] == nil)) { + ps.AddExtension("x-nullable", true) + } + } + // we have 2 cases: // 1. field with different name override tag // 2. field with different name removes tag @@ -1106,17 +1123,17 @@ func (t tagOptions) Name() string { return t[0] } -func parseJSONTag(field *ast.Field) (name string, ignore bool, isString bool, err error) { +func parseJSONTag(field *ast.Field) (name string, ignore, isString, omitEmpty bool, err error) { if len(field.Names) > 0 { name = field.Names[0].Name } if field.Tag == nil || len(strings.TrimSpace(field.Tag.Value)) == 0 { - return name, false, false, nil + return name, false, false, false, nil } tv, err := strconv.Unquote(field.Tag.Value) if err != nil { - return name, false, false, err + return name, false, false, false, err } if strings.TrimSpace(tv) != "" { @@ -1129,16 +1146,18 @@ func parseJSONTag(field *ast.Field) (name string, ignore bool, isString bool, er isString = isFieldStringable(field.Type) } + omitEmpty = jsonParts.Contain("omitempty") + switch jsonParts.Name() { case "-": - return name, true, isString, nil + return name, true, isString, omitEmpty, nil case "": - return name, false, isString, nil + return name, false, isString, omitEmpty, nil default: - return jsonParts.Name(), false, isString, nil + return jsonParts.Name(), false, isString, omitEmpty, nil } } - return name, false, false, nil + return name, false, false, false, nil } // isFieldStringable check if the field type is a scalar. If the field type is |
