github.com/JarrahG/buffalocli@v0.0.0-20230801092127-b85bfd5d395a/internal/genny/resource/resource.go (about)

     1  package resource
     2  
     3  import (
     4  	"embed"
     5  	"io/fs"
     6  	"text/template"
     7  
     8  	"github.com/gobuffalo/flect"
     9  	"github.com/gobuffalo/flect/name"
    10  	"github.com/gobuffalo/genny/v2"
    11  	"github.com/gobuffalo/genny/v2/gogen"
    12  )
    13  
    14  //go:embed templates/* templates/core/templates/folder-name/_form.plush.html.tmpl
    15  var templates embed.FS
    16  
    17  // New resource generator
    18  func New(opts *Options) (*genny.Generator, error) {
    19  	g := genny.New()
    20  
    21  	if err := opts.Validate(); err != nil {
    22  		return g, err
    23  	}
    24  
    25  	if !opts.SkipTemplates {
    26  		core, err := fs.Sub(templates, "templates/core")
    27  		if err != nil {
    28  			return g, err
    29  		}
    30  
    31  		if err := g.FS(core); err != nil {
    32  			return g, err
    33  		}
    34  	}
    35  
    36  	sub := "templates/use_model"
    37  	if opts.SkipModel {
    38  		sub = "templates/standard"
    39  	}
    40  
    41  	aFS, err := fs.Sub(templates, sub)
    42  	if err != nil {
    43  		return g, err
    44  	}
    45  
    46  	if err := g.FS(aFS); err != nil {
    47  		return g, err
    48  	}
    49  
    50  	pres := presenter{
    51  		App:   opts.App,
    52  		Name:  name.New(opts.Name),
    53  		Model: name.New(opts.Model),
    54  		Attrs: opts.Attrs,
    55  	}
    56  	x := pres.Name.Resource().File().String()
    57  	folder := pres.Name.Folder().Pluralize().String()
    58  	g.Transformer(genny.Replace("resource-name", x))
    59  	g.Transformer(genny.Replace("resource-use_model", x))
    60  	g.Transformer(genny.Replace("folder-name", folder))
    61  
    62  	data := map[string]interface{}{
    63  		"opts":    pres,
    64  		"actions": actions(opts),
    65  		"folder":  folder,
    66  	}
    67  	helpers := template.FuncMap{
    68  		"camelize": func(s string) string {
    69  			return flect.Camelize(s)
    70  		},
    71  	}
    72  	g.Transformer(gogen.TemplateTransformer(data, helpers))
    73  
    74  	g.RunFn(installPop(opts))
    75  
    76  	g.RunFn(addResource(pres))
    77  	return g, nil
    78  }