2017-10-16 02:23:15 +00:00
|
|
|
package httperror
|
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
|
|
|
)
|
|
|
|
|
|
|
|
var (
|
2017-11-21 20:46:30 +00:00
|
|
|
InvalidDateFormat = ErrorCode{"InvalidDateFormat", 422}
|
|
|
|
InvalidFormat = ErrorCode{"InvalidFormat", 422}
|
|
|
|
InvalidReference = ErrorCode{"InvalidReference", 422}
|
|
|
|
NotNullable = ErrorCode{"NotNullable", 422}
|
|
|
|
NotUnique = ErrorCode{"NotUnique", 422}
|
|
|
|
MinLimitExceeded = ErrorCode{"MinLimitExceeded", 422}
|
|
|
|
MaxLimitExceeded = ErrorCode{"MaxLimitExceeded", 422}
|
|
|
|
MinLengthExceeded = ErrorCode{"MinLengthExceeded", 422}
|
|
|
|
MaxLengthExceeded = ErrorCode{"MaxLengthExceeded", 422}
|
|
|
|
InvalidOption = ErrorCode{"InvalidOption", 422}
|
|
|
|
InvalidCharacters = ErrorCode{"InvalidCharacters", 422}
|
|
|
|
MissingRequired = ErrorCode{"MissingRequired", 422}
|
|
|
|
InvalidCSRFToken = ErrorCode{"InvalidCSRFToken", 422}
|
|
|
|
InvalidAction = ErrorCode{"InvalidAction", 422}
|
|
|
|
InvalidBodyContent = ErrorCode{"InvalidBodyContent", 422}
|
|
|
|
InvalidType = ErrorCode{"InvalidType", 422}
|
|
|
|
ActionNotAvailable = ErrorCode{"ActionNotAvailable", 404}
|
|
|
|
InvalidState = ErrorCode{"InvalidState", 422}
|
|
|
|
ServerError = ErrorCode{"ServerError", 500}
|
2017-12-18 20:56:50 +00:00
|
|
|
PermissionDenied = ErrorCode{"PermissionDenied", 403}
|
2017-11-11 04:44:02 +00:00
|
|
|
|
2017-11-21 20:46:30 +00:00
|
|
|
MethodNotAllowed = ErrorCode{"MethodNotAllow", 405}
|
|
|
|
NotFound = ErrorCode{"NotFound", 404}
|
2017-10-16 02:23:15 +00:00
|
|
|
)
|
|
|
|
|
2017-11-11 04:44:02 +00:00
|
|
|
type ErrorCode struct {
|
|
|
|
code string
|
|
|
|
status int
|
|
|
|
}
|
|
|
|
|
|
|
|
func (e ErrorCode) String() string {
|
|
|
|
return fmt.Sprintf("%s %d", e.code, e.status)
|
|
|
|
}
|
2017-10-16 02:23:15 +00:00
|
|
|
|
|
|
|
type APIError struct {
|
|
|
|
code ErrorCode
|
|
|
|
message string
|
|
|
|
Cause error
|
|
|
|
fieldName string
|
|
|
|
}
|
|
|
|
|
|
|
|
func NewAPIError(code ErrorCode, message string) error {
|
|
|
|
return &APIError{
|
|
|
|
code: code,
|
|
|
|
message: message,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func NewFieldAPIError(code ErrorCode, fieldName, message string) error {
|
|
|
|
return &APIError{
|
|
|
|
code: code,
|
|
|
|
message: message,
|
|
|
|
fieldName: fieldName,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func WrapFieldAPIError(err error, code ErrorCode, fieldName, message string) error {
|
|
|
|
return &APIError{
|
2017-11-11 04:44:02 +00:00
|
|
|
Cause: err,
|
2017-10-16 02:23:15 +00:00
|
|
|
code: code,
|
|
|
|
message: message,
|
|
|
|
fieldName: fieldName,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func WrapAPIError(err error, code ErrorCode, message string) error {
|
|
|
|
return &APIError{
|
|
|
|
code: code,
|
|
|
|
message: message,
|
|
|
|
Cause: err,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func (a *APIError) Error() string {
|
2017-11-11 04:44:02 +00:00
|
|
|
if a.fieldName != "" {
|
|
|
|
return fmt.Sprintf("%s=%s: %s", a.fieldName, a.code, a.message)
|
|
|
|
}
|
2017-10-16 02:23:15 +00:00
|
|
|
return fmt.Sprintf("%s: %s", a.code, a.message)
|
|
|
|
}
|