package middlewares import ( "net/http" "github.com/uptrace/bunrouter" "go.uber.org/zap" ) type HTTPError struct { StatusCode int `json:"code"` Message string `json:"message"` OriginError error `json:"-"` } func (e HTTPError) Error() string { return e.Message } func NewHTTPError(err error) HTTPError { return HTTPError{ StatusCode: http.StatusInternalServerError, Message: "Internal server error with unknown reason", OriginError: err, } } func ErrorHandler(next bunrouter.HandlerFunc) bunrouter.HandlerFunc { return func(w http.ResponseWriter, req bunrouter.Request) error { err := next(w, req) var httpErr HTTPError switch err := err.(type) { case nil: return nil case HTTPError: httpErr = err default: httpErr = NewHTTPError(err) } if httpErr.OriginError == nil { zap.L().Warn(httpErr.Message) } else { zap.L().Warn(httpErr.Message, zap.Error(httpErr.OriginError)) } w.WriteHeader(httpErr.StatusCode) _ = bunrouter.JSON(w, httpErr) return err } }