genhandler.go 2.8 KB

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