fn.go 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. package spec
  2. import (
  3. "errors"
  4. "strings"
  5. "github.com/tal-tech/go-zero/core/stringx"
  6. "github.com/tal-tech/go-zero/tools/goctl/util"
  7. )
  8. const bodyTagKey = "json"
  9. const formTagKey = "form"
  10. var definedKeys = []string{bodyTagKey, formTagKey, "path"}
  11. func (s Service) Routes() []Route {
  12. var result []Route
  13. for _, group := range s.Groups {
  14. result = append(result, group.Routes...)
  15. }
  16. return result
  17. }
  18. func (m Member) Tags() []*Tag {
  19. tags, err := Parse(m.Tag)
  20. if err != nil {
  21. panic(m.Tag + ", " + err.Error())
  22. }
  23. return tags.Tags()
  24. }
  25. func (m Member) IsOptional() bool {
  26. if !m.IsBodyMember() {
  27. return false
  28. }
  29. tag := m.Tags()
  30. for _, item := range tag {
  31. if item.Key == bodyTagKey {
  32. if stringx.Contains(item.Options, "optional") {
  33. return true
  34. }
  35. }
  36. }
  37. return false
  38. }
  39. func (m Member) IsOmitEmpty() bool {
  40. if !m.IsBodyMember() {
  41. return false
  42. }
  43. tag := m.Tags()
  44. for _, item := range tag {
  45. if item.Key == bodyTagKey {
  46. if stringx.Contains(item.Options, "omitempty") {
  47. return true
  48. }
  49. }
  50. }
  51. return false
  52. }
  53. func (m Member) IsOmitempty() bool {
  54. if !m.IsBodyMember() {
  55. return false
  56. }
  57. tag := m.Tags()
  58. for _, item := range tag {
  59. if item.Key == bodyTagKey {
  60. if stringx.Contains(item.Options, "omitempty") {
  61. return true
  62. }
  63. }
  64. }
  65. return false
  66. }
  67. func (m Member) GetPropertyName() (string, error) {
  68. tags := m.Tags()
  69. for _, tag := range tags {
  70. if stringx.Contains(definedKeys, tag.Key) {
  71. if tag.Name == "-" {
  72. return util.Untitle(m.Name), nil
  73. }
  74. return tag.Name, nil
  75. }
  76. }
  77. return "", errors.New("json property name not exist, member: " + m.Name)
  78. }
  79. func (m Member) GetComment() string {
  80. return strings.TrimSpace(m.Comment)
  81. }
  82. func (m Member) IsBodyMember() bool {
  83. if m.IsInline {
  84. return true
  85. }
  86. tags := m.Tags()
  87. for _, tag := range tags {
  88. if tag.Key == bodyTagKey {
  89. return true
  90. }
  91. }
  92. return false
  93. }
  94. func (m Member) IsFormMember() bool {
  95. if m.IsInline {
  96. return false
  97. }
  98. tags := m.Tags()
  99. for _, tag := range tags {
  100. if tag.Key == formTagKey {
  101. return true
  102. }
  103. }
  104. return false
  105. }
  106. func (t DefineStruct) GetBodyMembers() []Member {
  107. var result []Member
  108. for _, member := range t.Members {
  109. if member.IsBodyMember() {
  110. result = append(result, member)
  111. }
  112. }
  113. return result
  114. }
  115. func (t DefineStruct) GetFormMembers() []Member {
  116. var result []Member
  117. for _, member := range t.Members {
  118. if member.IsFormMember() {
  119. result = append(result, member)
  120. }
  121. }
  122. return result
  123. }
  124. func (t DefineStruct) GetNonBodyMembers() []Member {
  125. var result []Member
  126. for _, member := range t.Members {
  127. if !member.IsBodyMember() {
  128. result = append(result, member)
  129. }
  130. }
  131. return result
  132. }
  133. func (r Route) JoinedDoc() string {
  134. return strings.Join(r.Docs, " ")
  135. }
  136. func (r Route) GetAnnotation(key string) string {
  137. if r.Annotation.Properties == nil {
  138. return ""
  139. }
  140. return r.Annotation.Properties[key]
  141. }
  142. func (g Group) GetAnnotation(key string) string {
  143. if g.Annotation.Properties == nil {
  144. return ""
  145. }
  146. return g.Annotation.Properties[key]
  147. }
  148. func (r Route) ResponseTypeName() string {
  149. if r.ResponseType == nil {
  150. return ""
  151. }
  152. return r.ResponseType.Name()
  153. }
  154. func (r Route) RequestTypeName() string {
  155. if r.RequestType == nil {
  156. return ""
  157. }
  158. return r.RequestType.Name()
  159. }