A shared/http/error.go+package http
+
+import (
+ "fmt"
+ "net/http"
+)
+
+type Error struct {
+ Code int
+ Message string
+ Cause error
+}
+
+func (e *Error) Error() string {
+ if e.Message == "" {
+ e.Message = http.StatusText(e.Code)
+ }
+
+ return fmt.Sprintf("%d %s", e.Code, e.Message)
+}
+
+func NewError(code int, message string, cause error) *Error {
+ return &Error{
+ Code: code,
+ Message: message,
+ Cause: cause,
+ }
+}
+
+func NotFound(message string) *Error {
+ return &Error{
+ Code: http.StatusNotFound,
+ Message: message,
+ }
+}
+
+func BadRequest(message string, cause error) *Error {
+ return &Error{
+ Code: http.StatusBadRequest,
+ Message: message,
+ Cause: cause,
+ }
+}
+
+func InternalServerError(message string, cause error) *Error {
+ return &Error{
+ Code: http.StatusInternalServerError,
+ Message: message,
+ Cause: cause,
+ }
+}
+
+func Unauthorized(message string, cause error) *Error {
+ return &Error{
+ Code: http.StatusUnauthorized,
+ Message: message,
+ Cause: cause,
+ }
+}
+
+func Forbidden(message string, cause error) *Error {
+ return &Error{
+ Code: http.StatusForbidden,
+ Message: message,
+ Cause: cause,
+ }
+}