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

@ -147,7 +147,6 @@ func renderServiceRoutes(service spec.Service, groups []spec.Group, paths swagge
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
} }
parameters = append(parameters, renderStruct(member))
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, "//")
}
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{