Skip to content

Instantly share code, notes, and snippets.

@estenssoros
Created September 20, 2020 01:20
Show Gist options
  • Save estenssoros/7bf7df9f288318fc11e7a3cd3fa7a018 to your computer and use it in GitHub Desktop.
Save estenssoros/7bf7df9f288318fc11e7a3cd3fa7a018 to your computer and use it in GitHub Desktop.
medium-f8147ed0ad81-template.go
package main
import (
"io"
"os"
"path"
"text/template"
rice "github.com/GeertJohan/go.rice"
"github.com/labstack/echo"
"github.com/pkg/errors"
)
type Template struct {
templates *template.Template
}
func (t *Template) Render(w io.Writer, name string, data interface{}, c echo.Context) error {
return t.templates.ExecuteTemplate(w, name, data)
}
func NewTemplate() (*Template, error) {
box, err := rice.FindBox("./templates")
if err != nil {
return nil, errors.Wrap(err, "rice.FindBox")
}
t, err := parseFiles(box, nil)
if err != nil {
return nil, errors.Wrap(err, "parseFile")
}
return &Template{t}, nil
}
func parseFiles(box *rice.Box, t *template.Template) (*template.Template, error) {
filenames := []string{}
err := box.Walk(".", func(path string, info os.FileInfo, err error) error {
if info.IsDir() {
return nil
}
filenames = append(filenames, path)
return nil
})
if err != nil {
return nil, err
}
if len(filenames) == 0 {
return nil, errors.New("no files found")
}
for _, filename := range filenames {
name := path.Base(filename)
s, err := box.String(name)
if err != nil {
return nil, errors.Wrap(err, "box.String")
}
var tmpl *template.Template
if t == nil {
t = template.New(name)
}
if name == t.Name() {
tmpl = t
} else {
tmpl = t.New(name)
}
_, err = tmpl.Parse(s)
if err != nil {
return nil, err
}
}
return t, nil
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment