mkdir.go 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. package generator
  2. import (
  3. "path/filepath"
  4. "strings"
  5. conf "github.com/tal-tech/go-zero/tools/goctl/config"
  6. "github.com/tal-tech/go-zero/tools/goctl/rpc/parser"
  7. "github.com/tal-tech/go-zero/tools/goctl/util"
  8. "github.com/tal-tech/go-zero/tools/goctl/util/ctx"
  9. "github.com/tal-tech/go-zero/tools/goctl/util/stringx"
  10. )
  11. const (
  12. wd = "wd"
  13. etc = "etc"
  14. internal = "internal"
  15. config = "config"
  16. logic = "logic"
  17. server = "server"
  18. svc = "svc"
  19. pb = "pb"
  20. call = "call"
  21. )
  22. type (
  23. // DirContext defines a rpc service directories context
  24. DirContext interface {
  25. GetCall() Dir
  26. GetEtc() Dir
  27. GetInternal() Dir
  28. GetConfig() Dir
  29. GetLogic() Dir
  30. GetServer() Dir
  31. GetSvc() Dir
  32. GetPb() Dir
  33. GetMain() Dir
  34. GetServiceName() stringx.String
  35. }
  36. // Dir defines a directory
  37. Dir struct {
  38. Base string
  39. Filename string
  40. Package string
  41. }
  42. defaultDirContext struct {
  43. inner map[string]Dir
  44. serviceName stringx.String
  45. }
  46. )
  47. func mkdir(ctx *ctx.ProjectContext, proto parser.Proto, _ *conf.Config) (DirContext, error) {
  48. inner := make(map[string]Dir)
  49. etcDir := filepath.Join(ctx.WorkDir, "etc")
  50. internalDir := filepath.Join(ctx.WorkDir, "internal")
  51. configDir := filepath.Join(internalDir, "config")
  52. logicDir := filepath.Join(internalDir, "logic")
  53. serverDir := filepath.Join(internalDir, "server")
  54. svcDir := filepath.Join(internalDir, "svc")
  55. pbDir := filepath.Join(ctx.WorkDir, proto.GoPackage)
  56. callDir := filepath.Join(ctx.WorkDir, strings.ToLower(stringx.From(proto.Service.Name).ToCamel()))
  57. if strings.EqualFold(proto.Service.Name, proto.GoPackage) {
  58. callDir = filepath.Join(ctx.WorkDir, strings.ToLower(stringx.From(proto.Service.Name+"_client").ToCamel()))
  59. }
  60. inner[wd] = Dir{
  61. Filename: ctx.WorkDir,
  62. Package: filepath.ToSlash(filepath.Join(ctx.Path, strings.TrimPrefix(ctx.WorkDir, ctx.Dir))),
  63. Base: filepath.Base(ctx.WorkDir),
  64. }
  65. inner[etc] = Dir{
  66. Filename: etcDir,
  67. Package: filepath.ToSlash(filepath.Join(ctx.Path, strings.TrimPrefix(etcDir, ctx.Dir))),
  68. Base: filepath.Base(etcDir),
  69. }
  70. inner[internal] = Dir{
  71. Filename: internalDir,
  72. Package: filepath.ToSlash(filepath.Join(ctx.Path, strings.TrimPrefix(internalDir, ctx.Dir))),
  73. Base: filepath.Base(internalDir),
  74. }
  75. inner[config] = Dir{
  76. Filename: configDir,
  77. Package: filepath.ToSlash(filepath.Join(ctx.Path, strings.TrimPrefix(configDir, ctx.Dir))),
  78. Base: filepath.Base(configDir),
  79. }
  80. inner[logic] = Dir{
  81. Filename: logicDir,
  82. Package: filepath.ToSlash(filepath.Join(ctx.Path, strings.TrimPrefix(logicDir, ctx.Dir))),
  83. Base: filepath.Base(logicDir),
  84. }
  85. inner[server] = Dir{
  86. Filename: serverDir,
  87. Package: filepath.ToSlash(filepath.Join(ctx.Path, strings.TrimPrefix(serverDir, ctx.Dir))),
  88. Base: filepath.Base(serverDir),
  89. }
  90. inner[svc] = Dir{
  91. Filename: svcDir,
  92. Package: filepath.ToSlash(filepath.Join(ctx.Path, strings.TrimPrefix(svcDir, ctx.Dir))),
  93. Base: filepath.Base(svcDir),
  94. }
  95. inner[pb] = Dir{
  96. Filename: pbDir,
  97. Package: filepath.ToSlash(filepath.Join(ctx.Path, strings.TrimPrefix(pbDir, ctx.Dir))),
  98. Base: filepath.Base(pbDir),
  99. }
  100. inner[call] = Dir{
  101. Filename: callDir,
  102. Package: filepath.ToSlash(filepath.Join(ctx.Path, strings.TrimPrefix(callDir, ctx.Dir))),
  103. Base: filepath.Base(callDir),
  104. }
  105. for _, v := range inner {
  106. err := util.MkdirIfNotExist(v.Filename)
  107. if err != nil {
  108. return nil, err
  109. }
  110. }
  111. serviceName := strings.TrimSuffix(proto.Name, filepath.Ext(proto.Name))
  112. return &defaultDirContext{
  113. inner: inner,
  114. serviceName: stringx.From(strings.ReplaceAll(serviceName, "-", "")),
  115. }, nil
  116. }
  117. func (d *defaultDirContext) GetCall() Dir {
  118. return d.inner[call]
  119. }
  120. func (d *defaultDirContext) GetEtc() Dir {
  121. return d.inner[etc]
  122. }
  123. func (d *defaultDirContext) GetInternal() Dir {
  124. return d.inner[internal]
  125. }
  126. func (d *defaultDirContext) GetConfig() Dir {
  127. return d.inner[config]
  128. }
  129. func (d *defaultDirContext) GetLogic() Dir {
  130. return d.inner[logic]
  131. }
  132. func (d *defaultDirContext) GetServer() Dir {
  133. return d.inner[server]
  134. }
  135. func (d *defaultDirContext) GetSvc() Dir {
  136. return d.inner[svc]
  137. }
  138. func (d *defaultDirContext) GetPb() Dir {
  139. return d.inner[pb]
  140. }
  141. func (d *defaultDirContext) GetMain() Dir {
  142. return d.inner[wd]
  143. }
  144. func (d *defaultDirContext) GetServiceName() stringx.String {
  145. return d.serviceName
  146. }
  147. // Valid returns true if the directory is valid
  148. func (d *Dir) Valid() bool {
  149. return len(d.Filename) > 0 && len(d.Package) > 0
  150. }