package goblocks import ( "encoding/json" "log/slog" "net/http" "strings" ) type stringWriter struct { builder strings.Builder header http.Header } func newStringWriter() *stringWriter { return &stringWriter{ header: make(http.Header), } } func (w *stringWriter) Header() http.Header { return w.header } func (w *stringWriter) Write(b []byte) (int, error) { return w.builder.Write(b) } func (w *stringWriter) WriteHeader(statusCode int) {} func (a *App) JSON(w http.ResponseWriter, code int, v any) { w.Header().Set("Content-Type", "application/json") w.WriteHeader(code) json.NewEncoder(w).Encode(v) } func (a *App) HTML(w http.ResponseWriter, code int, name string, td *TemplateData) { w.Header().Set("Content-Type", "text/html; charset=utf-8") w.WriteHeader(code) err := a.Templates.Template(w, name, td) if err != nil { slog.Error("error rendering template", "error", err) http.Error(w, err.Error(), http.StatusInternalServerError) return } } func (a *App) RenderHTML(name string, td *TemplateData) (string, error) { sw := newStringWriter() err := a.Templates.Template(sw, name, td) if err != nil { slog.Error("error rendering template", "error", err) return "", err } return sw.builder.String(), nil }