github.com/segakazzz/buffalo@v0.16.22-0.20210119082501-1f52048d3feb/genny/actions/actions.go (about) 1 package actions 2 3 import ( 4 "fmt" 5 "strings" 6 7 "github.com/gobuffalo/flect/name" 8 "github.com/gobuffalo/genny/v2" 9 "github.com/gobuffalo/genny/v2/gogen" 10 "github.com/gobuffalo/packr/v2" 11 ) 12 13 var box = packr.New("github.com/gobuffalo/buffalo/genny/actions/templates", "../actions/templates") 14 15 // New returns a new generator for build actions on a Buffalo app 16 func New(opts *Options) (*genny.Generator, error) { 17 g := genny.New() 18 19 if err := opts.Validate(); err != nil { 20 return g, err 21 } 22 23 g.RunFn(construct(opts)) 24 return g, nil 25 } 26 27 func construct(opts *Options) genny.RunFn { 28 return func(r *genny.Runner) error { 29 pres := &presenter{ 30 Name: name.New(opts.Name), 31 Data: data{}, 32 Helpers: data{}, 33 Options: opts, 34 } 35 36 if err := buildActions(pres)(r); err != nil { 37 return err 38 } 39 40 if err := buildTests(pres)(r); err != nil { 41 return err 42 } 43 44 if err := updateApp(pres)(r); err != nil { 45 return err 46 } 47 48 if !opts.SkipTemplates { 49 if err := buildTemplates(pres)(r); err != nil { 50 return err 51 } 52 } 53 return nil 54 } 55 } 56 57 func transform(pres *presenter, f genny.File) (genny.File, error) { 58 pres.Data["actions"] = pres.Actions 59 pres.Data["name"] = pres.Name 60 t := gogen.TemplateTransformer(pres.Data, pres.Helpers) 61 return t.Transform(f) 62 } 63 64 func updateApp(pres *presenter) genny.RunFn { 65 return func(r *genny.Runner) error { 66 f, err := r.FindFile("actions/app.go") 67 if err != nil { 68 return err 69 } 70 var lines []string 71 body := f.String() 72 for _, a := range pres.Actions { 73 e := fmt.Sprintf("app.%s(\"/%s/%s\", %s%s)", strings.ToUpper(pres.Options.Method), pres.Name.Underscore(), a.Underscore(), pres.Name.Pascalize(), a.Pascalize()) 74 if !strings.Contains(body, e) { 75 lines = append(lines, e) 76 } 77 } 78 f, err = gogen.AddInsideBlock(f, "app == nil", strings.Join(lines, "\n\t\t")) 79 if err != nil { 80 return err 81 } 82 return r.File(f) 83 } 84 }