package renderer
import (
"fmt"
"html/template"
"io"
"io/fs"
"github.com/labstack/echo/v4"
)
type Renderer interface {
// Render will write the template to given the given writer.
// Will return an error if we can't write to the writer or we can
// can't find the template.
Render(w io.Writer, templateName string, data interface{}) error
}
type ErrTemplateNotFound struct {
Err error
Name string
}
func (e *ErrTemplateNotFound) Error() string {
return fmt.Sprintf("unable to find the template '%s', err: %v", e.Name, e.Err)
}
type ErrFailedToWrite struct {
Err error
}
func (e *ErrFailedToWrite) Error() string {
return fmt.Sprintf("failed to write template, err: %v", e.Err)
}
type HTMLRender struct {
fs fs.FS
pattern string
reload bool
templates *template.Template
}
func New(fs fs.FS, pattern string, reload bool) (*HTMLRender, error) {
return &HTMLRender{
templates: template.Must(template.ParseFS(fs, pattern)),
fs: fs,
pattern: pattern,
reload: reload,
}, nil
}
func (h *HTMLRender) Render(w io.Writer, templateName string, data interface{}, ctx echo.Context) error {
if h.reload {
h.templates = template.Must(template.ParseFS(h.fs, h.pattern))
}
return h.templates.ExecuteTemplate(w, templateName, data)
}