Merge pull request #46 from htlhenry/main

fix(bug): embed defineStruct parse bug
This commit is contained in:
MaxToby 2022-07-19 18:05:07 +08:00 committed by GitHub
commit 5d03152780
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -144,10 +144,9 @@ func renderServiceRoutes(service spec.Service, groups []spec.Group, paths swagge
for _, member := range defineStruct.Members { for _, member := range defineStruct.Members {
if member.Name == "" { if member.Name == "" {
memberDefineStruct, _ := member.Type.(spec.DefineStruct) memberDefineStruct, _ := member.Type.(spec.DefineStruct)
for _,m:=range memberDefineStruct.Members{ for _, m := range memberDefineStruct.Members {
if strings.Contains(m.Tag, "header") { if strings.Contains(m.Tag, "header") {
tempKind := swaggerMapTypes[strings.Replace(m.Type.Name(), "[]", "", -1)] tempKind := swaggerMapTypes[strings.Replace(m.Type.Name(), "[]", "", -1)]
ftype, format, ok := primitiveSchema(tempKind, m.Type.Name()) ftype, format, ok := primitiveSchema(tempKind, m.Type.Name())
if !ok { if !ok {
ftype = tempKind.String() ftype = tempKind.String()
@ -205,59 +204,13 @@ func renderServiceRoutes(service spec.Service, groups []spec.Group, paths swagge
if strings.Contains(member.Tag, "path") { if strings.Contains(member.Tag, "path") {
continue continue
} }
tempKind := swaggerMapTypes[strings.Replace(member.Type.Name(), "[]", "", -1)] if embedStruct, isEmbed := member.Type.(spec.DefineStruct); isEmbed {
for _, m := range embedStruct.Members {
ftype, format, ok := primitiveSchema(tempKind, member.Type.Name()) parameters = append(parameters, renderStruct(m))
if !ok {
ftype = tempKind.String()
format = "UNKNOWN"
}
sp := swaggerParameterObject{In: "query", Type: ftype, Format: format}
for _, tag := range member.Tags() {
sp.Name = tag.Name
if len(tag.Options) == 0 {
sp.Required = true
continue
} }
continue
required := true
for _, option := range tag.Options {
if strings.HasPrefix(option, optionsOption) {
segs := strings.SplitN(option, equalToken, 2)
if len(segs) == 2 {
sp.Enum = strings.Split(segs[1], optionSeparator)
}
}
if strings.HasPrefix(option, rangeOption) {
segs := strings.SplitN(option, equalToken, 2)
if len(segs) == 2 {
min, max, ok := parseRangeOption(segs[1])
if ok {
sp.Schema.Minimum = min
sp.Schema.Maximum = max
}
}
}
if strings.HasPrefix(option, defaultOption) {
segs := strings.Split(option, equalToken)
if len(segs) == 2 {
sp.Default = segs[1]
}
} else if strings.HasPrefix(option, optionalOption) || strings.HasPrefix(option, omitemptyOption) {
required = false
}
}
sp.Required = required
} }
parameters = append(parameters, renderStruct(member))
if len(member.Comment) > 0 {
sp.Description = strings.TrimLeft(member.Comment, "//")
}
parameters = append(parameters, sp)
} }
} else { } else {
@ -360,6 +313,62 @@ func renderServiceRoutes(service spec.Service, groups []spec.Group, paths swagge
} }
} }
func renderStruct(member spec.Member) swaggerParameterObject {
tempKind := swaggerMapTypes[strings.Replace(member.Type.Name(), "[]", "", -1)]
ftype, format, ok := primitiveSchema(tempKind, member.Type.Name())
if !ok {
ftype = tempKind.String()
format = "UNKNOWN"
}
sp := swaggerParameterObject{In: "query", Type: ftype, Format: format}
for _, tag := range member.Tags() {
sp.Name = tag.Name
if len(tag.Options) == 0 {
sp.Required = true
continue
}
required := true
for _, option := range tag.Options {
if strings.HasPrefix(option, optionsOption) {
segs := strings.SplitN(option, equalToken, 2)
if len(segs) == 2 {
sp.Enum = strings.Split(segs[1], optionSeparator)
}
}
if strings.HasPrefix(option, rangeOption) {
segs := strings.SplitN(option, equalToken, 2)
if len(segs) == 2 {
min, max, ok := parseRangeOption(segs[1])
if ok {
sp.Schema.Minimum = min
sp.Schema.Maximum = max
}
}
}
if strings.HasPrefix(option, defaultOption) {
segs := strings.Split(option, equalToken)
if len(segs) == 2 {
sp.Default = segs[1]
}
} else if strings.HasPrefix(option, optionalOption) || strings.HasPrefix(option, omitemptyOption) {
required = false
}
}
sp.Required = required
}
if len(member.Comment) > 0 {
sp.Description = strings.TrimLeft(member.Comment, "//")
}
return sp
}
func renderReplyAsDefinition(d swaggerDefinitionsObject, m messageMap, p []spec.Type, refs refMap) { func renderReplyAsDefinition(d swaggerDefinitionsObject, m messageMap, p []spec.Type, refs refMap) {
for _, i2 := range p { for _, i2 := range p {
schema := swaggerSchemaObject{ schema := swaggerSchemaObject{
@ -380,16 +389,16 @@ func renderReplyAsDefinition(d swaggerDefinitionsObject, m messageMap, p []spec.
if tag, err := member.GetPropertyName(); err == nil { if tag, err := member.GetPropertyName(); err == nil {
kv.Key = tag kv.Key = tag
} }
if kv.Key == ""{ if kv.Key == "" {
memberStruct ,_ := member.Type.(spec.DefineStruct) memberStruct, _ := member.Type.(spec.DefineStruct)
for _, m:=range memberStruct.Members{ for _, m := range memberStruct.Members {
if strings.Contains(m.Tag, "header") { if strings.Contains(m.Tag, "header") {
continue continue
} }
mkv := keyVal{ mkv := keyVal{
Value:schemaOfField(m), Value: schemaOfField(m),
Key: m.Name, Key: m.Name,
} }
if tag, err := m.GetPropertyName(); err == nil { if tag, err := m.GetPropertyName(); err == nil {