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  }