github.com/JarrahG/buffalocli@v0.0.0-20230801092127-b85bfd5d395a/internal/genny/newapp/core/root.go (about) 1 package core 2 3 import ( 4 "embed" 5 "html/template" 6 "io/fs" 7 "os/exec" 8 "strings" 9 10 "github.com/BurntSushi/toml" 11 "github.com/gobuffalo/genny/v2" 12 "github.com/gobuffalo/genny/v2/gogen" 13 ) 14 15 //go:embed templates/* 16 var templates embed.FS 17 18 func rootGenerator(opts *Options) (*genny.Generator, error) { 19 g := genny.New() 20 21 // validate opts 22 if err := opts.Validate(); err != nil { 23 return g, err 24 } 25 26 g.Command(exec.Command("go", "mod", "init", opts.App.PackagePkg)) 27 g.Transformer(genny.Dot()) 28 29 // TODO: workaround for 1.16, remove when we upgrade to 1.17 and rename "dot-*" files back to "-dot-*" 30 g.Transformer(genny.NewTransformer("*", func(f genny.File) (genny.File, error) { 31 name := f.Name() 32 if strings.HasPrefix(name, "dot-") { 33 name = strings.TrimPrefix(name, "dot-") 34 name = "." + name 35 } 36 return genny.NewFile(name, f), nil 37 })) 38 g.Transformer(genny.Replace("/dot-", "/.")) 39 40 // add common templates 41 sub, err := fs.Sub(templates, "templates") 42 if err != nil { 43 return g, err 44 } 45 46 if err := g.FS(sub); err != nil { 47 return g, err 48 } 49 50 data := map[string]interface{}{ 51 "opts": opts, 52 } 53 54 helpers := template.FuncMap{} 55 56 t := gogen.TemplateTransformer(data, helpers) 57 g.Transformer(t) 58 59 g.RunFn(func(r *genny.Runner) error { 60 f := genny.NewFile("config/buffalo-app.toml", nil) 61 if err := toml.NewEncoder(f).Encode(opts.App); err != nil { 62 return err 63 } 64 return r.File(f) 65 }) 66 67 return g, nil 68 }