Rene Nochebuena e8adc266a6 feat(httputil)!: promote to v1.0.0 — bump xerrors and valid to v1, stabilize API
Bump xerrors to v1.0.1 and valid to v1.0.1. Go directive bumped to 1.26.
API committed as stable: Handle, HandleNoBody, HandleEmpty, HandlerFunc,
JSON, NoContent, and Error are unchanged from v0.10.0.
2026-05-12 17:37:24 +00:00

httputil

Typed HTTP handler adapters and response helpers for stdlib net/http.

Install

go get code.nochebuena.dev/go/httputil

Typed handlers

// JSON body + validation + typed response
r.Post("/orders", httputil.Handle(validator, svc.CreateOrder))

// No request body (GET / DELETE)
r.Get("/orders/{id}", httputil.HandleNoBody(svc.GetOrder))

// Request body, no response body (204)
r.Delete("/orders/{id}", httputil.HandleEmpty(validator, svc.DeleteOrder))

// Manual handler with centralised error mapping
r.Get("/raw", httputil.HandlerFunc(func(w http.ResponseWriter, r *http.Request) error {
    data, err := svc.Load(r.Context(), chi.URLParam(r, "id"))
    if err != nil {
        return err
    }
    return httputil.JSON(w, http.StatusOK, data)
}))

Error mapping

xerrors.Code → HTTP status:

Code Status
ErrInvalidInput 400
ErrUnauthorized 401
ErrPermissionDenied 403
ErrNotFound 404
ErrAlreadyExists 409
ErrInternal 500
ErrNotImplemented 501
ErrUnavailable 503
ErrDeadlineExceeded 504
unknown 500

Error response body:

{"code": "NOT_FOUND", "message": "record not found"}

Fields from xerrors.Err are merged into the top-level response object.

Dependencies

  • code.nochebuena.dev/go/xerrors
  • code.nochebuena.dev/go/valid
Description
Typed handler adapters and JSON response helpers.
Readme MIT 57 KiB
2026-05-12 11:38:44 -06:00
Languages
Go 100%