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