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, layout, page string, td *TemplateData) { w.Header().Set("Content-Type", "text/html; charset=utf-8") w.WriteHeader(code) err := a.Templates.Template(w, layout, page, td) if err != nil { slog.Error("error rendering template", "error", err) http.Error(w, err.Error(), http.StatusInternalServerError) return } } func (a *App) RenderComponent(name string, td *TemplateData) (string, error) { result, err := a.Templates.RenderComponent(name, td) if err != nil { slog.Error("error rendering component", "component", name, "error", err) return "", err } return result, nil }