summaryrefslogtreecommitdiff
path: root/vendor/github.com/go-swagger/go-swagger/codescan/schema.go
diff options
context:
space:
mode:
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.go39
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