mkdir.go 5.3 KB

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