genmain.go 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. package generator
  2. import (
  3. _ "embed"
  4. "fmt"
  5. "path/filepath"
  6. "strings"
  7. conf "github.com/zeromicro/go-zero/tools/goctl/config"
  8. "github.com/zeromicro/go-zero/tools/goctl/rpc/parser"
  9. "github.com/zeromicro/go-zero/tools/goctl/util"
  10. "github.com/zeromicro/go-zero/tools/goctl/util/format"
  11. "github.com/zeromicro/go-zero/tools/goctl/util/pathx"
  12. )
  13. //go:embed main.tpl
  14. var mainTemplate string
  15. type MainServiceTemplateData struct {
  16. Service string
  17. ServerPkg string
  18. Pkg string
  19. }
  20. // GenMain generates the main file of the rpc service, which is an rpc service program call entry
  21. func (g *Generator) GenMain(ctx DirContext, proto parser.Proto, cfg *conf.Config,
  22. c *ZRpcContext) error {
  23. mainFilename, err := format.FileNamingFormat(cfg.NamingFormat, ctx.GetServiceName().Source())
  24. if err != nil {
  25. return err
  26. }
  27. fileName := filepath.Join(ctx.GetMain().Filename, fmt.Sprintf("%v.go", mainFilename))
  28. imports := make([]string, 0)
  29. pbImport := fmt.Sprintf(`"%v"`, ctx.GetPb().Package)
  30. svcImport := fmt.Sprintf(`"%v"`, ctx.GetSvc().Package)
  31. configImport := fmt.Sprintf(`"%v"`, ctx.GetConfig().Package)
  32. imports = append(imports, configImport, pbImport, svcImport)
  33. var serviceNames []MainServiceTemplateData
  34. for _, e := range proto.Service {
  35. var (
  36. remoteImport string
  37. serverPkg string
  38. )
  39. if !c.Multiple {
  40. serverPkg = "server"
  41. remoteImport = fmt.Sprintf(`"%v"`, ctx.GetServer().Package)
  42. } else {
  43. childPkg, err := ctx.GetServer().GetChildPackage(e.Name)
  44. if err != nil {
  45. return err
  46. }
  47. serverPkg = filepath.Base(childPkg + "Server")
  48. remoteImport = fmt.Sprintf(`%s "%v"`, serverPkg, childPkg)
  49. }
  50. imports = append(imports, remoteImport)
  51. serviceNames = append(serviceNames, MainServiceTemplateData{
  52. Service: parser.CamelCase(e.Name),
  53. ServerPkg: serverPkg,
  54. Pkg: proto.PbPackage,
  55. })
  56. }
  57. text, err := pathx.LoadTemplate(category, mainTemplateFile, mainTemplate)
  58. if err != nil {
  59. return err
  60. }
  61. etcFileName, err := format.FileNamingFormat(cfg.NamingFormat, ctx.GetServiceName().Source())
  62. if err != nil {
  63. return err
  64. }
  65. return util.With("main").GoFmt(true).Parse(text).SaveTo(map[string]interface{}{
  66. "serviceName": etcFileName,
  67. "imports": strings.Join(imports, pathx.NL),
  68. "pkg": proto.PbPackage,
  69. "serviceNames": serviceNames,
  70. }, fileName, false)
  71. }