genhandler.go 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. package gogen
  2. import (
  3. "fmt"
  4. "path/filepath"
  5. "strings"
  6. "github.com/tal-tech/go-zero/tools/goctl/util"
  7. )
  8. const (
  9. handlerTemplate = `{{.head}}
  10. package handler
  11. import (
  12. "context"
  13. {{.imports}}
  14. )
  15. type {{.types}}
  16. func New{{.server}}Server(svcCtx *svc.ServiceContext) *{{.server}}Server {
  17. return &{{.server}}Server{
  18. svcCtx: svcCtx,
  19. }
  20. }
  21. {{if .hasComment}}{{.comment}}{{end}}
  22. func (s *{{.server}}Server) {{.method}} (ctx context.Context, in *{{.package}}.{{.request}}) (*{{.package}}.{{.response}}, error) {
  23. l := logic.New{{.logicName}}(ctx,s.svcCtx)
  24. return l.{{.method}}(in)
  25. }
  26. `
  27. functionTemplate = `{{.head}}
  28. package handler
  29. import (
  30. "context"
  31. {{.imports}}
  32. )
  33. {{if .hasComment}}{{.comment}}{{end}}
  34. func (s *{{.server}}Server) {{.method}} (ctx context.Context, in *{{.package}}.{{.request}}) (*{{.package}}.{{.response}}, error) {
  35. l := logic.New{{.logicName}}(ctx,s.svcCtx)
  36. return l.{{.method}}(in)
  37. }
  38. `
  39. typeFmt = `%sServer struct {
  40. svcCtx *svc.ServiceContext
  41. }`
  42. newFuncFmt = `func New%sServer(svcCtx *svc.ServiceContext) *%sServer {
  43. return &%sServer{
  44. svcCtx: svcCtx,
  45. }
  46. }`
  47. )
  48. func (g *defaultRpcGenerator) genHandler() error {
  49. handlerPath := g.dirM[dirHandler]
  50. filename := fmt.Sprintf("%vhandler.go", g.Ctx.ServiceName.Lower())
  51. handlerFile := filepath.Join(handlerPath, filename)
  52. file := g.ast
  53. pkg := file.Package
  54. pbImport := fmt.Sprintf(`%v "%v"`, pkg, g.mustGetPackage(dirPb))
  55. logicImport := fmt.Sprintf(`"%v"`, g.mustGetPackage(dirLogic))
  56. svcImport := fmt.Sprintf(`"%v"`, g.mustGetPackage(dirSvc))
  57. imports := []string{
  58. pbImport,
  59. logicImport,
  60. svcImport,
  61. }
  62. types := make([]string, 0)
  63. newFuncs := make([]string, 0)
  64. head := util.GetHead(g.Ctx.ProtoSource)
  65. for _, service := range file.Service {
  66. types = append(types, fmt.Sprintf(typeFmt, service.Name.Title()))
  67. newFuncs = append(newFuncs, fmt.Sprintf(newFuncFmt, service.Name.Title(),
  68. service.Name.Title(), service.Name.Title()))
  69. }
  70. return util.With("server").GoFmt(true).Parse(handlerTemplate).SaveTo(map[string]interface{}{
  71. "head": head,
  72. "types": strings.Join(types, "\n"),
  73. "newFuncs": strings.Join(newFuncs, "\n"),
  74. "imports": strings.Join(imports, "\n\t"),
  75. }, handlerFile, true)
  76. }
  77. func (g *defaultRpcGenerator) genFunctions() error {
  78. handlerPath := g.dirM[dirHandler]
  79. file := g.ast
  80. pkg := file.Package
  81. head := util.GetHead(g.Ctx.ProtoSource)
  82. handlerImports := make([]string, 0)
  83. pbImport := fmt.Sprintf(`%v "%v"`, pkg, g.mustGetPackage(dirPb))
  84. handlerImports = append(handlerImports, pbImport, fmt.Sprintf(`"%v"`, g.mustGetPackage(dirLogic)))
  85. for _, service := range file.Service {
  86. for _, method := range service.Funcs {
  87. handlerName := fmt.Sprintf("%shandler.go", method.Name.Lower())
  88. filename := filepath.Join(handlerPath, handlerName)
  89. // override
  90. err := util.With("func").GoFmt(true).Parse(functionTemplate).SaveTo(map[string]interface{}{
  91. "head": head,
  92. "server": service.Name.Title(),
  93. "imports": strings.Join(handlerImports, "\n"),
  94. "logicName": fmt.Sprintf("%sLogic", method.Name.Title()),
  95. "method": method.Name.Title(),
  96. "package": pkg,
  97. "request": method.InType,
  98. "response": method.OutType,
  99. "hasComment": len(method.Document),
  100. "comment": strings.Join(method.Document, "\n"),
  101. }, filename, true)
  102. if err != nil {
  103. return err
  104. }
  105. }
  106. }
  107. return nil
  108. }