genhandlers.go 3.8 KB

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