package views import ( "fmt" "html/template" "io" "io/fs" "log" "net/http" "os" ) type Template struct { htmlTpl *template.Template } func (t Template) Execute(w http.ResponseWriter, r *http.Request, data interface{}) { w.Header().Set("Content-Type", "text/html; charset=utf8") err := t.htmlTpl.Execute(w, data) if err != nil { log.Printf("Error executing template: %v", err) http.Error(w, "Internal Server Error", http.StatusInternalServerError) return } } func (t Template) ExecuteWriter(w io.Writer, data interface{}) error { return t.htmlTpl.Execute(w, data) } func FromFile(pattern ...string) (Template, error) { fs := os.DirFS(".") return FromFS(fs, pattern...) } func FromFS(fs fs.FS, pattern ...string) (Template, error) { tpl, err := template.ParseFS(fs, pattern...) if err != nil { return Template{}, fmt.Errorf("Error parsing template: %v", err) } return Template{ htmlTpl: tpl, }, nil } func Must(t Template, err error) Template { if err != nil { panic(err) } return t }