From 5e30b470ccc9bc65d371b0d7a90678437fd56af0 Mon Sep 17 00:00:00 2001 From: Rogee Date: Wed, 10 Sep 2025 20:16:11 +0800 Subject: [PATCH] update --- cmd/gen.go | 1 + cmd/gen_provider.go | 2 +- cmd/gen_service.go | 90 ++++++++++++++++++++++++++++++ templates/services/services.go.tpl | 34 +++++++++++ templates/templates.go | 3 + 5 files changed, 129 insertions(+), 1 deletion(-) create mode 100644 cmd/gen_service.go create mode 100644 templates/services/services.go.tpl diff --git a/cmd/gen.go b/cmd/gen.go index 47100e5..e95b07c 100644 --- a/cmd/gen.go +++ b/cmd/gen.go @@ -15,6 +15,7 @@ func CommandGen(root *cobra.Command) { CommandGenRoute, CommandGenModel, CommandGenEnum, + CommandGenService, } for _, c := range cmds { diff --git a/cmd/gen_provider.go b/cmd/gen_provider.go index a74f066..13987ed 100644 --- a/cmd/gen_provider.go +++ b/cmd/gen_provider.go @@ -19,7 +19,7 @@ func CommandGenProvider(root *cobra.Command) { Aliases: []string{"p"}, Short: "Generate providers", Long: `// @provider -// @provider:[except|only] [returnType] [group] +// @provider(cronjob|job|event|grpc|model):[except|only] [returnType] [group] // when except add tag: inject:"false" // when only add tag: inject:"true"`, RunE: commandGenProviderE, diff --git a/cmd/gen_service.go b/cmd/gen_service.go new file mode 100644 index 0000000..a066554 --- /dev/null +++ b/cmd/gen_service.go @@ -0,0 +1,90 @@ +package cmd + +import ( + "embed" + "os" + "path/filepath" + "strings" + "text/template" + + "github.com/samber/lo" + "github.com/spf13/cobra" + "go.ipao.vip/atomctl/v2/templates" +) + +func CommandGenService(root *cobra.Command) { + cmd := &cobra.Command{ + Use: "service", + Short: "generate services", + RunE: commandGenServiceE, + PostRunE: commandGenProviderE, + } + + cmd.Flags().String("path", "./app/services", "base path to scan") + + root.AddCommand(cmd) +} + +func commandGenServiceE(cmd *cobra.Command, args []string) error { + path := cmd.Flag("path").Value.String() + + files, err := os.ReadDir(path) + if err != nil { + return err + } + + type srv struct { + CamelName string + ServiceName string + } + + // get services from files + var services []srv + for _, file := range files { + if file.IsDir() { + continue + } + name := file.Name() + if strings.HasSuffix(name, "_test.go") || strings.HasSuffix(name, ".gen.go") || + !strings.HasSuffix(name, ".go") { + continue + } + + name = strings.TrimSuffix(name, ".go") + + services = append(services, srv{ + CamelName: lo.PascalCase(name), + ServiceName: lo.CamelCase(name), + }) + } + + // 生成 services.gen.go 文件,使用 text/template 渲染 services.go.tpl 模板 + if err := renderTemplateFS(templates.Services, "services/services.go.tpl", services, filepath.Join(path, "services.gen.go"), true); err != nil { + return err + } + + return nil +} + +// renderTemplateFS 使用 text/template 渲染模板并写入目标文件 +func renderTemplateFS(fs embed.FS, tplName string, data interface{}, targetPath string, overwrite bool) error { + tplContent, err := fs.ReadFile(tplName) + if err != nil { + return err + } + tpl, err := template.New(tplName).Parse(string(tplContent)) + if err != nil { + return err + } + if !overwrite { + if _, err := os.Stat(targetPath); err == nil { + return nil // 文件已存在且不覆盖 + } + } + f, err := os.Create(targetPath) + if err != nil { + return err + } + defer f.Close() + return tpl.Execute(f, data) +} diff --git a/templates/services/services.go.tpl b/templates/services/services.go.tpl new file mode 100644 index 0000000..c67b06a --- /dev/null +++ b/templates/services/services.go.tpl @@ -0,0 +1,34 @@ +package services + +import ( + "gorm.io/gorm" +) + +var _db *gorm.DB + +// exported CamelCase Services +var ( +{{- range . }} + {{ .CamelName }} *{{ .ServiceName }} +{{- end }} +) + +// @provider(model) +type services struct { + db *gorm.DB + // define Services + {{- range . }} + {{ .ServiceName }} *{{ .ServiceName }} + {{- end }} +} + +func (svc *services) Prepare() error { + _db = svc.db + + // set exported Services here + {{- range . }} + {{ .CamelName }} = svc.{{ .ServiceName }} + {{- end }} + + return nil +} diff --git a/templates/templates.go b/templates/templates.go index 47da282..7c04ed7 100644 --- a/templates/templates.go +++ b/templates/templates.go @@ -16,3 +16,6 @@ var Events embed.FS //go:embed jobs var Jobs embed.FS + +//go:embed services +var Services embed.FS