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  }