Skip to content

Commit a4787d7

Browse files
authored
Merge pull request #98 from youbudong/main
fix: header parameters
2 parents 862371e + 8f66ac9 commit a4787d7

File tree

4 files changed

+150
-130
lines changed

4 files changed

+150
-130
lines changed

.gitignore

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,4 +15,6 @@ Thumbs.db
1515
*.ipr
1616

1717
#
18-
.swagger-codegen
18+
.swagger-codegen
19+
swagtest
20+
*.exe

example/user.api

Lines changed: 63 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -1,81 +1,81 @@
11
info(
2-
title: "type title here"
3-
desc: "type desc here"
4-
author: "type author here"
5-
email: "type email here"
6-
version: "type version here"
2+
title: "type title here"
3+
desc: "type desc here"
4+
author: "type author here"
5+
email: "type email here"
6+
version: "type version here"
77
)
88

9-
109
type (
11-
12-
//注册请求结构
13-
RegisterReq {
14-
Username string `json:"username"`
15-
Password string `json:"password"`
16-
Mobile string `json:"mobile"`
17-
}
1810

19-
LoginReq {
20-
Username string `json:"username"` //测试
21-
Password string `json:"password"`//测试2
22-
}
23-
UserInfoReq {
24-
Id string `path:"id"`
25-
}
11+
//注册请求结构
12+
RegisterReq {
13+
Username string `json:"username"`
14+
Password string `json:"password"`
15+
Mobile string `json:"mobile"`
16+
}
17+
18+
LoginReq {
19+
Username string `json:"username"` //测试
20+
Password string `json:"password"` //测试2
21+
AppId string `header:"appId"` //APPID-TEST
22+
}
23+
UserInfoReq {
24+
Id string `path:"id"`
25+
}
2626

27-
UserInfoReply {
28-
Name string `json:"name"`
29-
Age int `json:"age"`
30-
Birthday string `json:"birthday"`
31-
Description string `json:"description"`
32-
Tag []string `json:"tag"`
33-
Tags [][]string `json:"tags"`
34-
}
27+
UserInfoReply {
28+
Name string `json:"name"`
29+
Age int `json:"age"`
30+
Birthday string `json:"birthday"`
31+
Description string `json:"description"`
32+
Tag []string `json:"tag"`
33+
Tags [][]string `json:"tags"`
34+
}
3535

36-
UserSearchReq {
37-
KeyWord string `form:"keyWord"` // 关键词
38-
}
36+
UserSearchReq {
37+
KeyWord string `form:"keyWord"` // 关键词
38+
}
3939

40-
ErrorResponse {
41-
Code string `json:"code"`
42-
Message string `json:"message"`
43-
}
40+
ErrorResponse {
41+
Code string `json:"code"`
42+
Message string `json:"message"`
43+
}
4444
)
4545

4646
@server(
47-
prefix: /api
47+
prefix: /api
4848
)
4949

5050
service user-api {
51-
@doc(
52-
summary: 注册
53-
)
54-
@handler register
55-
post /user/register (RegisterReq)
51+
@doc(
52+
summary: 注册
53+
)
54+
@handler register
55+
post /user/register (RegisterReq)
5656

57-
@doc(
58-
summary: 登录
59-
)
60-
@handler login
61-
post /user/login (LoginReq)
57+
@doc(
58+
summary: 登录
59+
)
60+
@handler login
61+
post /user/login (LoginReq)
6262

63-
@doc(
64-
summary: 获取用户信息
65-
)
66-
@handler getUserInfo
67-
/*
68-
@respdoc-400 (
69-
100101: out of authority
70-
100102: user not exist
71-
) // Error code list
72-
*/
73-
/* @respdoc-500 (ErrorResponse) // Server Error */
74-
get /user/:id (UserInfoReq) returns (UserInfoReply)
63+
@doc(
64+
summary: 获取用户信息
65+
)
66+
@handler getUserInfo
67+
/*
68+
@respdoc-400 (
69+
100101: out of authority
70+
100102: user not exist
71+
) // Error code list
72+
*/
73+
/* @respdoc-500 (ErrorResponse) // Server Error */
74+
get /user/:id (UserInfoReq) returns (UserInfoReply)
7575

76-
@doc(
77-
summary: 用户搜索
78-
)
79-
@handler searchUser
80-
get /user/search (UserSearchReq) returns (UserInfoReply)
76+
@doc(
77+
summary: 用户搜索
78+
)
79+
@handler searchUser
80+
get /user/search (UserSearchReq) returns (UserInfoReply)
8181
}

generate/parser.go

Lines changed: 84 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -162,73 +162,13 @@ func renderServiceRoutes(service spec.Service, groups []spec.Group, paths swagge
162162
}
163163
if defineStruct, ok := route.RequestType.(spec.DefineStruct); ok {
164164
for _, member := range defineStruct.Members {
165-
if member.Name == "" {
166-
memberDefineStruct, _ := member.Type.(spec.DefineStruct)
167-
for _, m := range memberDefineStruct.Members {
168-
if strings.Contains(m.Tag, "header") {
169-
tempKind := swaggerMapTypes[strings.Replace(m.Type.Name(), "[]", "", -1)]
170-
ftype, format, ok := primitiveSchema(tempKind, m.Type.Name())
171-
if !ok {
172-
ftype = tempKind.String()
173-
format = "UNKNOWN"
174-
}
175-
sp := swaggerParameterObject{In: "header", Type: ftype, Format: format}
176-
177-
for _, tag := range m.Tags() {
178-
sp.Name = tag.Name
179-
if len(tag.Options) == 0 {
180-
sp.Required = true
181-
continue
182-
}
183-
184-
required := true
185-
for _, option := range tag.Options {
186-
if strings.HasPrefix(option, optionsOption) {
187-
segs := strings.SplitN(option, equalToken, 2)
188-
if len(segs) == 2 {
189-
sp.Enum = strings.Split(segs[1], optionSeparator)
190-
}
191-
}
192-
193-
if strings.HasPrefix(option, rangeOption) {
194-
segs := strings.SplitN(option, equalToken, 2)
195-
if len(segs) == 2 {
196-
min, max, ok := parseRangeOption(segs[1])
197-
if ok {
198-
sp.Schema.Minimum = min
199-
sp.Schema.Maximum = max
200-
}
201-
}
202-
}
203-
204-
if strings.HasPrefix(option, defaultOption) {
205-
segs := strings.Split(option, equalToken)
206-
if len(segs) == 2 {
207-
sp.Default = segs[1]
208-
}
209-
} else if strings.HasPrefix(option, optionalOption) || strings.HasPrefix(option, omitemptyOption) {
210-
required = false
211-
}
212-
213-
if strings.HasPrefix(option, exampleOption) {
214-
segs := strings.Split(option, equalToken)
215-
if len(segs) == 2 {
216-
sp.Example = segs[1]
217-
}
218-
}
219-
}
220-
sp.Required = required
221-
}
222-
sp.Description = strings.TrimLeft(m.Comment, "//")
223-
parameters = append(parameters, sp)
224-
}
225-
}
226-
continue
165+
if hasHeaderParameters(member) {
166+
parameters = parseHeader(member, parameters)
227167
}
228168
}
229169
if strings.ToUpper(route.Method) == http.MethodGet {
230170
for _, member := range defineStruct.Members {
231-
if strings.Contains(member.Tag, "path") {
171+
if hasPathParameters(member) || hasHeaderParameters(member) {
232172
continue
233173
}
234174
if embedStruct, isEmbed := member.Type.(spec.DefineStruct); isEmbed {
@@ -483,7 +423,7 @@ func renderReplyAsDefinition(d swaggerDefinitionsObject, m messageMap, p []spec.
483423
schema.Title = defineStruct.Name()
484424

485425
for _, member := range defineStruct.Members {
486-
if hasPathParameters(member) {
426+
if hasPathParameters(member) || hasHeaderParameters(member) {
487427
continue
488428
}
489429
kv := keyVal{Value: schemaOfField(member)}
@@ -494,8 +434,7 @@ func renderReplyAsDefinition(d swaggerDefinitionsObject, m messageMap, p []spec.
494434
if kv.Key == "" {
495435
memberStruct, _ := member.Type.(spec.DefineStruct)
496436
for _, m := range memberStruct.Members {
497-
498-
if strings.Contains(m.Tag, "header") {
437+
if hasHeaderParameters(m) || hasPathParameters(m) {
499438
continue
500439
}
501440

@@ -560,6 +499,15 @@ func hasPathParameters(member spec.Member) bool {
560499
return false
561500
}
562501

502+
func hasHeaderParameters(member spec.Member) bool {
503+
for _, tag := range member.Tags() {
504+
if tag.Key == "header" {
505+
return true
506+
}
507+
}
508+
return false
509+
}
510+
563511
func schemaOfField(member spec.Member) swaggerSchemaObject {
564512
ret := swaggerSchemaObject{}
565513

@@ -751,3 +699,73 @@ func contains(s []string, str string) bool {
751699

752700
return false
753701
}
702+
703+
func parseHeader(m spec.Member, parameters []swaggerParameterObject) []swaggerParameterObject {
704+
705+
tempKind := swaggerMapTypes[strings.Replace(m.Type.Name(), "[]", "", -1)]
706+
ftype, format, ok := primitiveSchema(tempKind, m.Type.Name())
707+
if !ok {
708+
ftype = tempKind.String()
709+
format = "UNKNOWN"
710+
}
711+
sp := swaggerParameterObject{In: "header", Type: ftype, Format: format}
712+
713+
for _, tag := range m.Tags() {
714+
sp.Name = tag.Name
715+
if len(tag.Options) == 0 {
716+
sp.Required = true
717+
continue
718+
}
719+
720+
required := true
721+
for _, option := range tag.Options {
722+
if strings.HasPrefix(option, optionsOption) {
723+
segs := strings.SplitN(option, equalToken, 2)
724+
if len(segs) == 2 {
725+
sp.Enum = strings.Split(segs[1], optionSeparator)
726+
}
727+
}
728+
729+
if strings.HasPrefix(option, rangeOption) {
730+
segs := strings.SplitN(option, equalToken, 2)
731+
if len(segs) == 2 {
732+
min, max, ok := parseRangeOption(segs[1])
733+
if ok {
734+
sp.Schema.Minimum = min
735+
sp.Schema.Maximum = max
736+
}
737+
}
738+
}
739+
740+
if strings.HasPrefix(option, defaultOption) {
741+
segs := strings.Split(option, equalToken)
742+
if len(segs) == 2 {
743+
sp.Default = segs[1]
744+
}
745+
} else if strings.HasPrefix(option, optionalOption) || strings.HasPrefix(option, omitemptyOption) {
746+
required = false
747+
}
748+
749+
if strings.HasPrefix(option, exampleOption) {
750+
segs := strings.Split(option, equalToken)
751+
if len(segs) == 2 {
752+
sp.Example = segs[1]
753+
}
754+
}
755+
}
756+
sp.Required = required
757+
}
758+
sp.Description = strings.TrimLeft(m.Comment, "//")
759+
if m.Name == "" {
760+
memberDefineStruct, ok := m.Type.(spec.DefineStruct)
761+
if !ok {
762+
return parameters
763+
}
764+
for _, cm := range memberDefineStruct.Members {
765+
if hasHeaderParameters(cm) {
766+
parameters = parseHeader(cm, parameters)
767+
}
768+
}
769+
}
770+
return append(parameters, sp)
771+
}

swagtest

-12.2 MB
Binary file not shown.

0 commit comments

Comments
 (0)