package httpx import ( "encoding/json" "errors" "net/http" ) type statusError struct { status int err error } func (e statusError) Error() string { if e.err == nil { return "" } return e.err.Error() } func (e statusError) Unwrap() error { return e.err } func ErrorWithStatus(status int, err error) error { if err == nil { return nil } return statusError{status: status, err: err} } func StatusFromError(err error) (int, bool) { var target statusError if errors.As(err, &target) { return target.status, true } return 0, false } func WriteJSON(w http.ResponseWriter, status int, v any) { w.Header().Set("Content-Type", "application/json") w.WriteHeader(status) enc := json.NewEncoder(w) enc.SetIndent("", " ") _ = enc.Encode(v) } func WriteError(w http.ResponseWriter, status int, msg string) { WriteJSON(w, status, map[string]string{"error": msg}) } func DecodeJSON(r *http.Request, dst any) error { dec := json.NewDecoder(r.Body) dec.DisallowUnknownFields() return dec.Decode(dst) } func CORSMiddleware(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.Header().Set("Access-Control-Allow-Origin", "*") w.Header().Set("Access-Control-Allow-Methods", "GET, POST, PUT, PATCH, DELETE, OPTIONS") w.Header().Set("Access-Control-Allow-Headers", "Content-Type") if r.Method == http.MethodOptions { w.WriteHeader(http.StatusNoContent) return } next.ServeHTTP(w, r) }) }