fn.go 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218
  1. package spec
  2. import (
  3. "errors"
  4. "path"
  5. "strings"
  6. "github.com/zeromicro/go-zero/core/stringx"
  7. "github.com/zeromicro/go-zero/tools/goctl/util"
  8. )
  9. const (
  10. bodyTagKey = "json"
  11. formTagKey = "form"
  12. pathTagKey = "path"
  13. defaultSummaryKey = "summary"
  14. )
  15. var definedKeys = []string{bodyTagKey, formTagKey, pathTagKey}
  16. func (s Service) JoinPrefix() Service {
  17. var groups []Group
  18. for _, g := range s.Groups {
  19. prefix := strings.TrimSpace(g.GetAnnotation(RoutePrefixKey))
  20. prefix = strings.ReplaceAll(prefix, `"`, "")
  21. var routes []Route
  22. for _, r := range g.Routes {
  23. r.Path = path.Join("/", prefix, r.Path)
  24. routes = append(routes, r)
  25. }
  26. g.Routes = routes
  27. groups = append(groups, g)
  28. }
  29. s.Groups = groups
  30. return s
  31. }
  32. // Routes returns all routes in api service
  33. func (s Service) Routes() []Route {
  34. var result []Route
  35. for _, group := range s.Groups {
  36. result = append(result, group.Routes...)
  37. }
  38. return result
  39. }
  40. // Tags returns all tags in Member
  41. func (m Member) Tags() []*Tag {
  42. tags, err := Parse(m.Tag)
  43. if err != nil {
  44. panic(m.Tag + ", " + err.Error())
  45. }
  46. return tags.Tags()
  47. }
  48. // IsOptional returns true if tag is optional
  49. func (m Member) IsOptional() bool {
  50. if !m.IsBodyMember() {
  51. return false
  52. }
  53. tag := m.Tags()
  54. for _, item := range tag {
  55. if item.Key == bodyTagKey {
  56. if stringx.Contains(item.Options, "optional") {
  57. return true
  58. }
  59. }
  60. }
  61. return false
  62. }
  63. // IsOmitEmpty returns true if tag contains omitempty
  64. func (m Member) IsOmitEmpty() bool {
  65. if !m.IsBodyMember() {
  66. return false
  67. }
  68. tag := m.Tags()
  69. for _, item := range tag {
  70. if item.Key == bodyTagKey {
  71. if stringx.Contains(item.Options, "omitempty") {
  72. return true
  73. }
  74. }
  75. }
  76. return false
  77. }
  78. // GetPropertyName returns json tag value
  79. func (m Member) GetPropertyName() (string, error) {
  80. tags := m.Tags()
  81. for _, tag := range tags {
  82. if stringx.Contains(definedKeys, tag.Key) {
  83. if tag.Name == "-" {
  84. return util.Untitle(m.Name), nil
  85. }
  86. return tag.Name, nil
  87. }
  88. }
  89. return "", errors.New("json property name not exist, member: " + m.Name)
  90. }
  91. // GetComment returns comment value of Member
  92. func (m Member) GetComment() string {
  93. return strings.TrimSpace(m.Comment)
  94. }
  95. // IsBodyMember returns true if contains json tag
  96. func (m Member) IsBodyMember() bool {
  97. if m.IsInline {
  98. return true
  99. }
  100. tags := m.Tags()
  101. for _, tag := range tags {
  102. if tag.Key == bodyTagKey {
  103. return true
  104. }
  105. }
  106. return false
  107. }
  108. // IsFormMember returns true if contains form tag
  109. func (m Member) IsFormMember() bool {
  110. if m.IsInline {
  111. return false
  112. }
  113. tags := m.Tags()
  114. for _, tag := range tags {
  115. if tag.Key == formTagKey {
  116. return true
  117. }
  118. }
  119. return false
  120. }
  121. // GetBodyMembers returns all json fields
  122. func (t DefineStruct) GetBodyMembers() []Member {
  123. var result []Member
  124. for _, member := range t.Members {
  125. if member.IsBodyMember() {
  126. result = append(result, member)
  127. }
  128. }
  129. return result
  130. }
  131. // GetFormMembers returns all form fields
  132. func (t DefineStruct) GetFormMembers() []Member {
  133. var result []Member
  134. for _, member := range t.Members {
  135. if member.IsFormMember() {
  136. result = append(result, member)
  137. }
  138. }
  139. return result
  140. }
  141. // GetNonBodyMembers returns all have no tag fields
  142. func (t DefineStruct) GetNonBodyMembers() []Member {
  143. var result []Member
  144. for _, member := range t.Members {
  145. if !member.IsBodyMember() {
  146. result = append(result, member)
  147. }
  148. }
  149. return result
  150. }
  151. // JoinedDoc joins comments and summary value in AtDoc
  152. func (r Route) JoinedDoc() string {
  153. doc := r.AtDoc.Text
  154. if r.AtDoc.Properties != nil {
  155. doc += r.AtDoc.Properties[defaultSummaryKey]
  156. }
  157. doc += strings.Join(r.Docs, " ")
  158. return strings.TrimSpace(doc)
  159. }
  160. // GetAnnotation returns the value by specified key from @server
  161. func (r Route) GetAnnotation(key string) string {
  162. if r.AtServerAnnotation.Properties == nil {
  163. return ""
  164. }
  165. return r.AtServerAnnotation.Properties[key]
  166. }
  167. // GetAnnotation returns the value by specified key from @server
  168. func (g Group) GetAnnotation(key string) string {
  169. if g.Annotation.Properties == nil {
  170. return ""
  171. }
  172. return g.Annotation.Properties[key]
  173. }
  174. // ResponseTypeName returns response type name of route
  175. func (r Route) ResponseTypeName() string {
  176. if r.ResponseType == nil {
  177. return ""
  178. }
  179. return r.ResponseType.Name()
  180. }
  181. // RequestTypeName returns request type name of route
  182. func (r Route) RequestTypeName() string {
  183. if r.RequestType == nil {
  184. return ""
  185. }
  186. return r.RequestType.Name()
  187. }