package main import ( "embed" "io" "io/fs" // "fmt" "log" // "os" // "path/filepath" "text/template" // "github.com/davecgh/go-spew/spew" ) var ( //go:embed "tplfiles" tplfiles embed.FS tpl *template.Template = template.New("") tw *TplWalker = new(TplWalker) ) type ( TplWalker struct { tpl *template.Template fs fs.FS } ) func (t *TplWalker) walkFunc(fpath string, d fs.DirEntry, inErr error) (err error) { var b []byte var f fs.File if inErr != nil { err = inErr return } if d.IsDir() { return } if f, err = t.fs.Open(fpath); err != nil { return } defer func() { var ok bool var c io.Closer if f != nil { if c, ok = f.(io.Closer); ok { if err = c.Close(); err != nil { return } } } }() if b, err = io.ReadAll(f); err != nil { return } if _, err = t.tpl.New(fpath).Parse(string(b)); err != nil { return } return } func (t *TplWalker) Walk() (err error) { if err = fs.WalkDir(t.fs, ".", t.walkFunc); err != nil { return } return } func init() { var err error tw.tpl = tpl tw.fs = tplfiles if err = tw.Walk(); err != nil { log.Panicln(err) } } func main() { var idx int var sub *template.Template log.Printf("Root template name is %q", tpl.Name()) for idx, sub = range tpl.Templates() { log.Printf("Sub template %d: %q", idx, sub.Name()) } }