// Package httpx implements the application HTTP server: routing, middleware // (recovery, request id, trusted-proxy client resolution, access logging), // health endpoints, and shared JSON response helpers. Named httpx to avoid // clashing with net/http; it lives in internal/http per the repository layout. package httpx import ( "encoding/json" "log/slog" "net/http" ) // errorEnvelope is the consistent error body for every JSON error response: // {"error":{"code":"...","message":"..."}}. type errorEnvelope struct { Error errorBody `json:"error"` } type errorBody struct { Code string `json:"code"` Message string `json:"message"` } func writeJSON(w http.ResponseWriter, status int, v any) { w.Header().Set("Content-Type", "application/json; charset=utf-8") w.WriteHeader(status) if err := json.NewEncoder(w).Encode(v); err != nil { slog.Error("write json response", "err", err) } } func writeError(w http.ResponseWriter, status int, code, message string) { writeJSON(w, status, errorEnvelope{Error: errorBody{Code: code, Message: message}}) }