123 lines
2.7 KiB
Go
123 lines
2.7 KiB
Go
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(path.Join(shortName, 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
|
|
}
|