github.com/Accefy/pop@v0.0.0-20230428174248-e9f677eab5b9/genny/model/model.go (about) 1 package model 2 3 import ( 4 "embed" 5 "io/fs" 6 "strings" 7 8 "github.com/gobuffalo/flect" 9 "github.com/gobuffalo/flect/name" 10 "github.com/gobuffalo/genny/v2" 11 "github.com/gobuffalo/genny/v2/gogen" 12 ) 13 14 //go:embed templates/* 15 var templates embed.FS 16 17 // New returns a generator for creating a new model 18 func New(opts *Options) (*genny.Generator, error) { 19 g := genny.New() 20 21 if err := opts.Validate(); err != nil { 22 return g, err 23 } 24 25 sub, err := fs.Sub(templates, "templates") 26 if err != nil { 27 return g, err 28 } 29 30 if err := g.FS(sub); err != nil { 31 return g, err 32 } 33 34 m := presenter{ 35 Name: name.New(opts.Name), 36 Encoding: name.New(opts.Encoding), 37 Validations: validatable(opts.Attrs), 38 Imports: buildImports(opts), 39 } 40 41 ctx := map[string]interface{}{ 42 "opts": opts, 43 "model": m, 44 } 45 help := map[string]interface{}{ 46 "capitalize": flect.Capitalize, 47 "trim_package": func(t string) string { 48 i := strings.LastIndex(t, ".") 49 if i == -1 { 50 return t 51 } 52 return t[i+1:] 53 }, 54 } 55 56 t := gogen.TemplateTransformer(ctx, help) 57 g.Transformer(t) 58 g.Transformer(genny.Replace("name-", flect.Singularize(opts.Name))) 59 g.Transformer(genny.Replace("path-", opts.Path)) 60 return g, nil 61 }