github.com/JarrahG/buffalocli@v0.0.0-20230801092127-b85bfd5d395a/internal/genny/mail/mail.go (about) 1 package mail 2 3 import ( 4 "embed" 5 "io/fs" 6 "text/template" 7 8 "github.com/gobuffalo/genny/v2" 9 "github.com/gobuffalo/genny/v2/gogen" 10 ) 11 12 //go:embed init/templates/* 13 var templates embed.FS 14 15 // New mailer generator. It will init the mailers directory if it doesn't already exist 16 func New(opts *Options) (*genny.Group, error) { 17 gg := &genny.Group{} 18 19 if err := opts.Validate(); err != nil { 20 return gg, err 21 } 22 23 if !opts.SkipInit { 24 g, err := initGenerator(opts) 25 if err != nil { 26 return gg, err 27 } 28 gg.Add(g) 29 } 30 31 g := genny.New() 32 h := template.FuncMap{} 33 data := map[string]interface{}{ 34 "opts": opts, 35 } 36 t := gogen.TemplateTransformer(data, h) 37 g.Transformer(t) 38 39 fn := opts.Name.File().String() 40 g.File(genny.NewFileS("mailers/"+fn+".go.tmpl", mailerTmpl)) 41 g.File(genny.NewFileS("templates/mail/"+fn+".plush.html.tmpl", mailTmpl)) 42 gg.Add(g) 43 return gg, nil 44 } 45 46 func initGenerator(opts *Options) (*genny.Generator, error) { 47 g := genny.New() 48 49 sub, err := fs.Sub(templates, "init/templates") 50 if err != nil { 51 return g, err 52 } 53 54 if err := g.FS(sub); err != nil { 55 return g, err 56 } 57 h := template.FuncMap{} 58 data := map[string]interface{}{ 59 "opts": opts, 60 } 61 t := gogen.TemplateTransformer(data, h) 62 g.Transformer(t) 63 64 g.Should = func(r *genny.Runner) bool { 65 _, err := r.FindFile("mailers/mailers.go") 66 return err != nil 67 } 68 opts.Name.Titleize() 69 return g, nil 70 } 71 72 const mailerTmpl = `package mailers 73 74 import ( 75 "github.com/gobuffalo/buffalo/mail" 76 "github.com/gobuffalo/buffalo/render" 77 ) 78 79 func Send{{.opts.Name.Resource}}() error { 80 m := mail.NewMessage() 81 82 // fill in with your stuff: 83 m.Subject = "{{.opts.Name.Titleize}}" 84 m.From = "" 85 m.To = []string{} 86 err := m.AddBody(r.HTML("mail/{{.opts.Name.File}}.html"), render.Data{}) 87 if err != nil { 88 return err 89 } 90 return smtp.Send(m) 91 } 92 ` 93 94 const mailTmpl = `<h2>{{.opts.Name.Titleize}}</h2> 95 96 <h3>templates/mail/{{.opts.Name.File}}.plush.html</h3>`