package generator import ( "bytes" "embed" "html/template" "io" "io/fs" "os" "path" "time" "git.nobla.cn/golang/aeus/tools/gen/internal/types" ) var ( fileMap = map[string]string{ "cmd/main.go": MainTemp, "internal/scope/scope.go": ScopeTemp, "internal/service/service.go": ServiceLoaderTemp, "api/v1/pb/greeter.proto": GreeterTemp, "version/version.go": VersionTemp, "Makefile": MakefileTemp, ".gitignore": GitIgnoreTemp, "README.md": ReadmeTemp, "go.mod": GoModTemp, "webhook.yaml": WebhookTemp, "deploy/docker/deployment.yaml": DeploymentTemp, } ) var ( //go:embed third_party protoDir embed.FS ) type ( TemplateData struct { ShortName string PackageName string Datetime string Version string ImageRegistry string } ) func writeFile(file string, buf []byte) (err error) { dirname := path.Dir(file) if _, err = os.Stat(dirname); err != nil { if err = os.MkdirAll(dirname, 0755); err != nil { return } } err = os.WriteFile(file, buf, 0644) return } func scanDir(s embed.FS, dirname string, callback func(file string) error) (err error) { var ( entities []fs.DirEntry ) if entities, err = s.ReadDir(dirname); err != nil { return nil } for _, entity := range entities { if entity.Name() == "." || entity.Name() == ".." { continue } name := path.Join(dirname, entity.Name()) if entity.IsDir() { scanDir(s, name, callback) } else { if err = callback(name); err != nil { break } } } return } func Geerate(app *types.Applicetion) (err error) { shortName := app.ShortName() data := TemplateData{ ShortName: shortName, PackageName: app.Package, Version: app.Version, ImageRegistry: "{{IMAGE_REGISTRY_URL}}", Datetime: time.Now().Format(time.DateTime), } if data.Version == "" { data.Version = "v0.0.1" } var t *template.Template writer := bytes.NewBuffer(nil) for name, tmpl := range fileMap { if t, err = template.New(name).Parse(tmpl); err != nil { return } if err = t.Execute(writer, data); err != nil { return } if err = writeFile(path.Join(shortName, name), writer.Bytes()); err != nil { return } writer.Reset() } if err = writeFile(shortName+".go", []byte("package "+shortName)); err != nil { return } err = scanDir(protoDir, "third_party", func(filename string) error { if fp, openerr := protoDir.Open(filename); openerr != nil { return openerr } else { if buf, readerr := io.ReadAll(fp); readerr == nil { writeFile(path.Join(shortName, filename), buf) } fp.Close() } return nil }) return }