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>`