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  }