2021-09-10 14:20:57 +02:00
|
|
|
package generator
|
|
|
|
|
|
|
|
import (
|
|
|
|
"os"
|
|
|
|
"path/filepath"
|
|
|
|
"strings"
|
|
|
|
"text/template"
|
|
|
|
)
|
|
|
|
|
|
|
|
type Generator interface {
|
2021-09-10 14:31:52 +02:00
|
|
|
Generate([]File) error
|
2021-09-10 14:20:57 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
type generator struct {
|
|
|
|
opts Options
|
|
|
|
}
|
|
|
|
|
2021-09-10 14:31:52 +02:00
|
|
|
type File struct {
|
|
|
|
Path string
|
|
|
|
Template string
|
|
|
|
}
|
|
|
|
|
2021-09-10 14:20:57 +02:00
|
|
|
// Generate generates project template files.
|
2021-09-10 14:31:52 +02:00
|
|
|
func (g *generator) Generate(files []File) error {
|
2021-09-10 14:20:57 +02:00
|
|
|
for _, file := range files {
|
|
|
|
fp := filepath.Join(g.opts.Directory, file.Path)
|
|
|
|
dir := filepath.Dir(fp)
|
|
|
|
|
|
|
|
if _, err := os.Stat(dir); os.IsNotExist(err) {
|
|
|
|
if err := os.MkdirAll(dir, 0755); err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
f, err := os.Create(fp)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
fn := template.FuncMap{
|
|
|
|
"dehyphen": func(s string) string {
|
|
|
|
return strings.ReplaceAll(s, "-", "")
|
|
|
|
},
|
|
|
|
"lower": strings.ToLower,
|
|
|
|
"title": func(s string) string {
|
|
|
|
return strings.ReplaceAll(strings.Title(s), "-", "")
|
|
|
|
},
|
|
|
|
}
|
|
|
|
t, err := template.New(fp).Funcs(fn).Parse(file.Template)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
err = t.Execute(f, g.opts)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
// New returns a new generator struct.
|
|
|
|
func New(opts ...Option) Generator {
|
|
|
|
var options Options
|
|
|
|
for _, o := range opts {
|
|
|
|
o(&options)
|
|
|
|
}
|
|
|
|
|
|
|
|
return &generator{
|
|
|
|
opts: options,
|
|
|
|
}
|
|
|
|
}
|