github.com/segakazzz/buffalo@v0.16.22-0.20210119082501-1f52048d3feb/genny/resource/resource.go (about)

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