genhandler.go 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  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. remoteTemplate = `{{.head}}
  10. package handler
  11. import {{.imports}}
  12. type {{.types}}
  13. {{.newFuncs}}
  14. `
  15. functionTemplate = `{{.head}}
  16. package handler
  17. import (
  18. "context"
  19. {{.imports}}
  20. )
  21. type {{.server}}Server struct{}
  22. {{if .hasComment}}{{.comment}}{{end}}
  23. func (s *{{.server}}Server) {{.method}} (ctx context.Context, in *{{.package}}.{{.request}}) (*{{.package}}.{{.response}}, error) {
  24. l := logic.New{{.logicName}}(ctx,s.svcCtx)
  25. return l.{{.method}}(in)
  26. }
  27. `
  28. typeFmt = `%sServer struct {
  29. svcCtx *svc.ServiceContext
  30. }`
  31. newFuncFmt = `func New%sServer(svcCtx *svc.ServiceContext) *%sServer {
  32. return &%sServer{
  33. svcCtx: svcCtx,
  34. }
  35. }`
  36. )
  37. func (g *defaultRpcGenerator) genRemoteHandler() error {
  38. handlerPath := g.dirM[dirHandler]
  39. serverGo := fmt.Sprintf("%vhandler.go", g.Ctx.ServiceName.Lower())
  40. fileName := filepath.Join(handlerPath, serverGo)
  41. file := g.ast
  42. svcImport := fmt.Sprintf(`"%v"`, g.mustGetPackage(dirSvc))
  43. types := make([]string, 0)
  44. newFuncs := make([]string, 0)
  45. head := util.GetHead(g.Ctx.ProtoSource)
  46. for _, service := range file.Service {
  47. types = append(types, fmt.Sprintf(typeFmt, service.Name.Title()))
  48. newFuncs = append(newFuncs, fmt.Sprintf(newFuncFmt, service.Name.Title(), service.Name.Title(), service.Name.Title()))
  49. }
  50. err := util.With("server").GoFmt(true).Parse(remoteTemplate).SaveTo(map[string]interface{}{
  51. "head": head,
  52. "types": strings.Join(types, "\n"),
  53. "newFuncs": strings.Join(newFuncs, "\n"),
  54. "imports": svcImport,
  55. }, fileName, true)
  56. if err != nil {
  57. return err
  58. }
  59. return g.genFunctions()
  60. }
  61. func (g *defaultRpcGenerator) genFunctions() error {
  62. handlerPath := g.dirM[dirHandler]
  63. file := g.ast
  64. pkg := file.Package
  65. head := util.GetHead(g.Ctx.ProtoSource)
  66. handlerImports := make([]string, 0)
  67. pbImport := fmt.Sprintf(`%v "%v"`, pkg, g.mustGetPackage(dirPb))
  68. handlerImports = append(handlerImports, pbImport, fmt.Sprintf(`"%v"`, g.mustGetPackage(dirLogic)))
  69. for _, service := range file.Service {
  70. for _, method := range service.Funcs {
  71. handlerName := fmt.Sprintf("%shandler.go", method.Name.Lower())
  72. filename := filepath.Join(handlerPath, handlerName)
  73. // override
  74. err := util.With("func").GoFmt(true).Parse(functionTemplate).SaveTo(map[string]interface{}{
  75. "head": head,
  76. "server": service.Name.Title(),
  77. "imports": strings.Join(handlerImports, "\r\n"),
  78. "logicName": fmt.Sprintf("%sLogic", method.Name.Title()),
  79. "method": method.Name.Title(),
  80. "package": pkg,
  81. "request": method.InType,
  82. "response": method.OutType,
  83. "hasComment": len(method.Document),
  84. "comment": strings.Join(method.Document, "\r\n"),
  85. }, filename, true)
  86. if err != nil {
  87. return err
  88. }
  89. }
  90. }
  91. return nil
  92. }