make HTTP error an interface
1 file changed, 65 insertions(+), 37 deletions(-)
changed files
M shared/http/error.go → shared/http/error.go
@@ -5,63 +5,91 @@ "fmt" "net/http" ) -type Error struct { - Code int - Message string - Cause error +type Error interface { + error + StatusCode() int + Message() string + Unwrap() error + WriteHTTP(w http.ResponseWriter) } -func (e *Error) Error() string { - if e.Message == "" { - e.Message = http.StatusText(e.Code) +type httpError struct { + code int + message string + cause error +} + +func (e *httpError) Error() string { + if e.message == "" { + e.message = http.StatusText(e.code) } - return fmt.Sprintf("%d %s", e.Code, e.Message) + return fmt.Sprintf("%d %s", e.code, e.message) +} + +func (e *httpError) StatusCode() int { + return e.code } -func NewError(code int, message string, cause error) *Error { - return &Error{ - Code: code, - Message: message, - Cause: cause, +func (e *httpError) Message() string { + if e.message == "" { + e.message = http.StatusText(e.code) } + + return e.message } -func NotFound(message string) *Error { - return &Error{ - Code: http.StatusNotFound, - Message: message, +func (e *httpError) Unwrap() error { + return e.cause +} + +func (e *httpError) WriteHTTP(w http.ResponseWriter) { + http.Error(w, e.message, e.code) +} + +func NewError(code int, message string, cause error) Error { + return &httpError{ + code: code, + message: message, + cause: cause, } } -func BadRequest(message string, cause error) *Error { - return &Error{ - Code: http.StatusBadRequest, - Message: message, - Cause: cause, +func NotFound(message string) Error { + return &httpError{ + code: http.StatusNotFound, + message: message, } } -func InternalServerError(message string, cause error) *Error { - return &Error{ - Code: http.StatusInternalServerError, - Message: message, - Cause: cause, +func BadRequest(message string, cause error) Error { + return &httpError{ + code: http.StatusBadRequest, + message: message, + cause: cause, + } +} + +func InternalServerError(message string, cause error) Error { + return &httpError{ + code: http.StatusInternalServerError, + message: message, + cause: cause, } } -func Unauthorized(message string, cause error) *Error { - return &Error{ - Code: http.StatusUnauthorized, - Message: message, - Cause: cause, +func Unauthorized(message string, cause error) Error { + return &httpError{ + code: http.StatusUnauthorized, + message: message, + cause: cause, } } -func Forbidden(message string, cause error) *Error { - return &Error{ - Code: http.StatusForbidden, - Message: message, - Cause: cause, +func Forbidden(message string, cause error) Error { + return &httpError{ + code: http.StatusForbidden, + message: message, + cause: cause, } }