github.com/JarrahG/buffalocli@v0.0.0-20230801092127-b85bfd5d395a/internal/genny/actions/actions.go (about) 1 package actions 2 3 import ( 4 "embed" 5 "fmt" 6 "strings" 7 8 "github.com/gobuffalo/flect/name" 9 "github.com/gobuffalo/genny/v2" 10 "github.com/gobuffalo/genny/v2/gogen" 11 ) 12 13 //go:embed templates/* 14 var templates embed.FS 15 16 // New returns a new generator for build actions on a Buffalo app 17 func New(opts *Options) (*genny.Generator, error) { 18 g := genny.New() 19 20 if err := opts.Validate(); err != nil { 21 return g, err 22 } 23 24 g.RunFn(construct(opts)) 25 return g, nil 26 } 27 28 func construct(opts *Options) genny.RunFn { 29 return func(r *genny.Runner) error { 30 pres := &presenter{ 31 Name: name.New(opts.Name), 32 Data: data{}, 33 Helpers: data{}, 34 Options: opts, 35 } 36 37 if err := buildActions(pres)(r); err != nil { 38 return err 39 } 40 41 if err := buildTests(pres)(r); err != nil { 42 return err 43 } 44 45 if err := updateApp(pres)(r); err != nil { 46 return err 47 } 48 49 if !opts.SkipTemplates { 50 if err := buildTemplates(pres)(r); err != nil { 51 return err 52 } 53 } 54 return nil 55 } 56 } 57 58 func transform(pres *presenter, f genny.File) (genny.File, error) { 59 pres.Data["actions"] = pres.Actions 60 pres.Data["name"] = pres.Name 61 t := gogen.TemplateTransformer(pres.Data, pres.Helpers) 62 return t.Transform(f) 63 } 64 65 func updateApp(pres *presenter) genny.RunFn { 66 return func(r *genny.Runner) error { 67 f, err := r.FindFile("actions/app.go") 68 if err != nil { 69 return err 70 } 71 72 var lines []string 73 body := f.String() 74 for _, a := range pres.Actions { 75 e := fmt.Sprintf("app.%s(\"/%s/%s\", %s%s)", strings.ToUpper(pres.Options.Method), pres.Name.Underscore(), a.Underscore(), pres.Name.Pascalize(), a.Pascalize()) 76 if !strings.Contains(body, e) { 77 lines = append(lines, e) 78 } 79 } 80 81 f, err = gogen.AddInsideBlock(f, "appOnce.Do(func() {", strings.Join(lines, "\n\t\t")) 82 if err != nil { 83 if strings.Contains(err.Error(), "could not find desired block") { 84 f, err = gogen.AddInsideBlock(f, "if app == nil {", strings.Join(lines, "\n\t\t")) 85 if err != nil { 86 return err 87 } else { 88 r.Logger.Warnf("This app was built with CLI v0.18.8 or older. See https://gobuffalo.io/documentation/known-issues/#cli-v0.18.8") 89 } 90 } else { 91 return err 92 } 93 } 94 return r.File(f) 95 } 96 }