github.com/JarrahG/buffalocli@v0.0.0-20230801092127-b85bfd5d395a/internal/genny/actions/build_actions.go (about) 1 package actions 2 3 import ( 4 "fmt" 5 "io" 6 "io/fs" 7 "strings" 8 9 "github.com/gobuffalo/flect/name" 10 "github.com/gobuffalo/genny/v2" 11 ) 12 13 // buildActions is the top level action builder 14 // it determines whether to build a new actions/foo.go file 15 // or append to an existing one 16 func buildActions(pres *presenter) genny.RunFn { 17 return func(r *genny.Runner) error { 18 fn := fmt.Sprintf("actions/%s.go", pres.Name.File()) 19 xf, err := r.FindFile(fn) 20 if err != nil { 21 return buildNewActions(fn, pres)(r) 22 } 23 if err := appendActions(xf, pres)(r); err != nil { 24 return err 25 } 26 27 return nil 28 } 29 } 30 31 // buildNewActions builds a brand new actions/foo.go file 32 // and files it with actions 33 func buildNewActions(fn string, pres *presenter) genny.RunFn { 34 return func(r *genny.Runner) error { 35 for _, a := range pres.Options.Actions { 36 pres.Actions = append(pres.Actions, name.New(a)) 37 } 38 39 sub, err := fs.Sub(templates, "templates") 40 if err != nil { 41 return err 42 } 43 44 h, err := sub.Open("actions_header.go.tmpl") 45 if err != nil { 46 return err 47 } 48 a, err := sub.Open("actions.go.tmpl") 49 if err != nil { 50 return err 51 } 52 53 f := genny.NewFile(fn+".tmpl", io.MultiReader(h, a)) 54 f, err = transform(pres, f) 55 if err != nil { 56 return err 57 } 58 return r.File(f) 59 } 60 } 61 62 // appendActions appends *only* actions that don't exist in 63 // actions/foo.go. if the action already exists it is not touched. 64 func appendActions(f genny.File, pres *presenter) genny.RunFn { 65 return func(r *genny.Runner) error { 66 body := f.String() 67 for _, ac := range pres.Options.Actions { 68 a := name.New(ac) 69 x := fmt.Sprintf("func %s%s", pres.Name.Pascalize(), a.Pascalize()) 70 if strings.Contains(body, x) { 71 continue 72 } 73 pres.Actions = append(pres.Actions, a) 74 } 75 76 sub, err := fs.Sub(templates, "templates") 77 if err != nil { 78 return err 79 } 80 81 a, err := sub.Open("actions.go.tmpl") 82 if err != nil { 83 return err 84 } 85 86 f = genny.NewFile(f.Name()+".tmpl", io.MultiReader(f, a)) 87 f, err = transform(pres, f) 88 if err != nil { 89 return err 90 } 91 return r.File(f) 92 } 93 }