genhandlers.go 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. package gogen
  2. import (
  3. _ "embed"
  4. "fmt"
  5. "path"
  6. "strings"
  7. "github.com/zeromicro/go-zero/tools/goctl/api/spec"
  8. "github.com/zeromicro/go-zero/tools/goctl/config"
  9. "github.com/zeromicro/go-zero/tools/goctl/internal/version"
  10. "github.com/zeromicro/go-zero/tools/goctl/util"
  11. "github.com/zeromicro/go-zero/tools/goctl/util/format"
  12. "github.com/zeromicro/go-zero/tools/goctl/util/pathx"
  13. "github.com/zeromicro/go-zero/tools/goctl/vars"
  14. )
  15. const defaultLogicPackage = "logic"
  16. //go:embed handler.tpl
  17. var handlerTemplate string
  18. type handlerInfo struct {
  19. PkgName string
  20. ImportPackages string
  21. HandlerName string
  22. RequestType string
  23. LogicName string
  24. LogicType string
  25. Call string
  26. HasResp bool
  27. HasRequest bool
  28. After1_1_10 bool
  29. }
  30. func genHandler(dir, rootPkg string, cfg *config.Config, group spec.Group, route spec.Route) error {
  31. handler := getHandlerName(route)
  32. handlerPath := getHandlerFolderPath(group, route)
  33. pkgName := handlerPath[strings.LastIndex(handlerPath, "/")+1:]
  34. logicName := defaultLogicPackage
  35. if handlerPath != handlerDir {
  36. handler = strings.Title(handler)
  37. logicName = pkgName
  38. }
  39. parentPkg, err := getParentPackage(dir)
  40. if err != nil {
  41. return err
  42. }
  43. goctlVersion := version.GetGoctlVersion()
  44. // todo(anqiansong): This will be removed after a certain number of production versions of goctl (probably 5)
  45. after1_1_10 := version.IsVersionGreaterThan(goctlVersion, "1.1.10")
  46. return doGenToFile(dir, handler, cfg, group, route, handlerInfo{
  47. PkgName: pkgName,
  48. ImportPackages: genHandlerImports(group, route, parentPkg),
  49. HandlerName: handler,
  50. After1_1_10: after1_1_10,
  51. RequestType: util.Title(route.RequestTypeName()),
  52. LogicName: logicName,
  53. LogicType: strings.Title(getLogicName(route)),
  54. Call: strings.Title(strings.TrimSuffix(handler, "Handler")),
  55. HasResp: len(route.ResponseTypeName()) > 0,
  56. HasRequest: len(route.RequestTypeName()) > 0,
  57. })
  58. }
  59. func doGenToFile(dir, handler string, cfg *config.Config, group spec.Group,
  60. route spec.Route, handleObj handlerInfo) error {
  61. filename, err := format.FileNamingFormat(cfg.NamingFormat, handler)
  62. if err != nil {
  63. return err
  64. }
  65. return genFile(fileGenConfig{
  66. dir: dir,
  67. subdir: getHandlerFolderPath(group, route),
  68. filename: filename + ".go",
  69. templateName: "handlerTemplate",
  70. category: category,
  71. templateFile: handlerTemplateFile,
  72. builtinTemplate: handlerTemplate,
  73. data: handleObj,
  74. })
  75. }
  76. func genHandlers(dir, rootPkg string, cfg *config.Config, api *spec.ApiSpec) error {
  77. for _, group := range api.Service.Groups {
  78. for _, route := range group.Routes {
  79. if err := genHandler(dir, rootPkg, cfg, group, route); err != nil {
  80. return err
  81. }
  82. }
  83. }
  84. return nil
  85. }
  86. func genHandlerImports(group spec.Group, route spec.Route, parentPkg string) string {
  87. var imports []string
  88. imports = append(imports, fmt.Sprintf("\"%s\"",
  89. pathx.JoinPackages(parentPkg, getLogicFolderPath(group, route))))
  90. imports = append(imports, fmt.Sprintf("\"%s\"", pathx.JoinPackages(parentPkg, contextDir)))
  91. if len(route.RequestTypeName()) > 0 {
  92. imports = append(imports, fmt.Sprintf("\"%s\"\n", pathx.JoinPackages(parentPkg, typesDir)))
  93. }
  94. currentVersion := version.GetGoctlVersion()
  95. // todo(anqiansong): This will be removed after a certain number of production versions of goctl (probably 5)
  96. if !version.IsVersionGreaterThan(currentVersion, "1.1.10") {
  97. imports = append(imports, fmt.Sprintf("\"%s/rest/httpx\"", vars.ProjectOpenSourceURL))
  98. }
  99. return strings.Join(imports, "\n\t")
  100. }
  101. func getHandlerBaseName(route spec.Route) (string, error) {
  102. handler := route.Handler
  103. handler = strings.TrimSpace(handler)
  104. handler = strings.TrimSuffix(handler, "handler")
  105. handler = strings.TrimSuffix(handler, "Handler")
  106. return handler, nil
  107. }
  108. func getHandlerFolderPath(group spec.Group, route spec.Route) string {
  109. folder := route.GetAnnotation(groupProperty)
  110. if len(folder) == 0 {
  111. folder = group.GetAnnotation(groupProperty)
  112. if len(folder) == 0 {
  113. return handlerDir
  114. }
  115. }
  116. folder = strings.TrimPrefix(folder, "/")
  117. folder = strings.TrimSuffix(folder, "/")
  118. return path.Join(handlerDir, folder)
  119. }
  120. func getHandlerName(route spec.Route) string {
  121. handler, err := getHandlerBaseName(route)
  122. if err != nil {
  123. panic(err)
  124. }
  125. return handler + "Handler"
  126. }
  127. func getLogicName(route spec.Route) string {
  128. handler, err := getHandlerBaseName(route)
  129. if err != nil {
  130. panic(err)
  131. }
  132. return handler + "Logic"
  133. }