github.com/Accefy/pop@v0.0.0-20230428174248-e9f677eab5b9/genny/model/model.go (about)

     1  package model
     2  
     3  import (
     4  	"embed"
     5  	"io/fs"
     6  	"strings"
     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/*
    15  var templates embed.FS
    16  
    17  // New returns a generator for creating a new model
    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  	sub, err := fs.Sub(templates, "templates")
    26  	if err != nil {
    27  		return g, err
    28  	}
    29  
    30  	if err := g.FS(sub); err != nil {
    31  		return g, err
    32  	}
    33  
    34  	m := presenter{
    35  		Name:        name.New(opts.Name),
    36  		Encoding:    name.New(opts.Encoding),
    37  		Validations: validatable(opts.Attrs),
    38  		Imports:     buildImports(opts),
    39  	}
    40  
    41  	ctx := map[string]interface{}{
    42  		"opts":  opts,
    43  		"model": m,
    44  	}
    45  	help := map[string]interface{}{
    46  		"capitalize": flect.Capitalize,
    47  		"trim_package": func(t string) string {
    48  			i := strings.LastIndex(t, ".")
    49  			if i == -1 {
    50  				return t
    51  			}
    52  			return t[i+1:]
    53  		},
    54  	}
    55  
    56  	t := gogen.TemplateTransformer(ctx, help)
    57  	g.Transformer(t)
    58  	g.Transformer(genny.Replace("name-", flect.Singularize(opts.Name)))
    59  	g.Transformer(genny.Replace("path-", opts.Path))
    60  	return g, nil
    61  }