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 }