github.com/gobuffalo/buffalo-cli/v2@v2.0.0-alpha.15.0.20200919213536-a7350c8e6799/cli/internal/plugins/plush/generators/resource/generator.go (about)

     1  package resource
     2  
     3  import (
     4  	"context"
     5  	"fmt"
     6  	"io/ioutil"
     7  	"os"
     8  	"path/filepath"
     9  	"strings"
    10  	"text/template"
    11  
    12  	"github.com/gobuffalo/attrs"
    13  	"github.com/gobuffalo/buffalo-cli/v2/cli/cmds/resource"
    14  	"github.com/gobuffalo/flect/name"
    15  	"github.com/gobuffalo/plugins"
    16  	"github.com/gobuffalo/plugins/plugprint"
    17  	"github.com/markbates/pkger"
    18  	"github.com/spf13/pflag"
    19  )
    20  
    21  var _ plugins.Plugin = &Generator{}
    22  var _ plugprint.FlagPrinter = &Generator{}
    23  var _ resource.Pflagger = &Generator{}
    24  var _ resource.Templater = &Generator{}
    25  
    26  type Generator struct {
    27  	modelName string
    28  	flags     *pflag.FlagSet
    29  }
    30  
    31  func (g *Generator) PluginName() string {
    32  	return "plush/templates"
    33  }
    34  
    35  func (g *Generator) GenerateResourceTemplates(ctx context.Context, root string, args []string) error {
    36  	if len(args) == 0 {
    37  		err := fmt.Errorf("you must specify a resource name")
    38  		return plugins.Wrap(g, err)
    39  	}
    40  
    41  	atts, err := attrs.ParseArgs(args[1:]...)
    42  	if err != nil {
    43  		return plugins.Wrap(g, err)
    44  	}
    45  
    46  	modelName := g.modelName
    47  	if len(modelName) == 0 {
    48  		modelName = args[0]
    49  	}
    50  
    51  	opts := struct {
    52  		Attrs  attrs.Attrs
    53  		Folder string
    54  		Model  name.Ident
    55  		Name   name.Ident
    56  	}{
    57  		Attrs: atts,
    58  		Name:  name.New(args[0]),
    59  		Model: name.New(modelName),
    60  	}
    61  	opts.Folder = opts.Name.Folder().Pluralize().String()
    62  
    63  	fp := pkger.Include("github.com/gobuffalo/buffalo-cli/v2:/cli/internal/plugins/plush/generators/resource/templates")
    64  
    65  	err = pkger.Walk(fp, func(path string, info os.FileInfo, err error) error {
    66  		if err != nil {
    67  			return err
    68  		}
    69  
    70  		if info.IsDir() {
    71  			return nil
    72  		}
    73  
    74  		tf, err := pkger.Open(path)
    75  		if err != nil {
    76  			return err
    77  		}
    78  		defer tf.Close()
    79  
    80  		b, err := ioutil.ReadAll(tf)
    81  		if err != nil {
    82  			return err
    83  		}
    84  
    85  		tmpl := string(b)
    86  
    87  		t, err := template.New(path).Parse(tmpl)
    88  		if err != nil {
    89  			return err
    90  		}
    91  
    92  		x := strings.TrimPrefix(path, fp)
    93  		x = strings.TrimSuffix(x, string(filepath.Separator))
    94  		x = filepath.Join(root, "templates", opts.Folder, x)
    95  		x = strings.TrimSuffix(x, ".tmpl")
    96  
    97  		if err := os.MkdirAll(filepath.Dir(x), 0755); err != nil {
    98  			return err
    99  		}
   100  
   101  		f, err := os.Create(x)
   102  		if err != nil {
   103  			return err
   104  		}
   105  		defer f.Close()
   106  
   107  		if err := t.Execute(f, opts); err != nil {
   108  			return err
   109  		}
   110  
   111  		return nil
   112  	})
   113  
   114  	return plugins.Wrap(g, err)
   115  }