2022-02-03 10:32:03 +03:00
|
|
|
package common
|
|
|
|
|
|
|
|
import (
|
|
|
|
"errors"
|
|
|
|
)
|
|
|
|
|
|
|
|
// Code is the error code.
|
|
|
|
type Code int
|
|
|
|
|
|
|
|
// Application error codes.
|
|
|
|
const (
|
2022-08-24 16:53:12 +03:00
|
|
|
// 0 ~ 99 general error.
|
2022-02-03 10:32:03 +03:00
|
|
|
Ok Code = 0
|
|
|
|
Internal Code = 1
|
|
|
|
NotAuthorized Code = 2
|
|
|
|
Invalid Code = 3
|
|
|
|
NotFound Code = 4
|
|
|
|
Conflict Code = 5
|
|
|
|
NotImplemented Code = 6
|
|
|
|
)
|
|
|
|
|
|
|
|
// Error represents an application-specific error. Application errors can be
|
|
|
|
// unwrapped by the caller to extract out the code & message.
|
|
|
|
//
|
|
|
|
// Any non-application error (such as a disk error) should be reported as an
|
|
|
|
// Internal error and the human user should only see "Internal error" as the
|
|
|
|
// message. These low-level internal error details should only be logged and
|
|
|
|
// reported to the operator of the application (not the end user).
|
|
|
|
type Error struct {
|
|
|
|
// Machine-readable error code.
|
|
|
|
Code Code
|
|
|
|
|
|
|
|
// Embedded error.
|
|
|
|
Err error
|
|
|
|
}
|
|
|
|
|
|
|
|
// Error implements the error interface. Not used by the application otherwise.
|
|
|
|
func (e *Error) Error() string {
|
|
|
|
return e.Err.Error()
|
|
|
|
}
|
|
|
|
|
|
|
|
// ErrorCode unwraps an application error and returns its code.
|
|
|
|
// Non-application errors always return EINTERNAL.
|
|
|
|
func ErrorCode(err error) Code {
|
|
|
|
var e *Error
|
|
|
|
if err == nil {
|
|
|
|
return Ok
|
|
|
|
} else if errors.As(err, &e) {
|
|
|
|
return e.Code
|
|
|
|
}
|
|
|
|
return Internal
|
|
|
|
}
|
|
|
|
|
|
|
|
// ErrorMessage unwraps an application error and returns its message.
|
|
|
|
// Non-application errors always return "Internal error".
|
|
|
|
func ErrorMessage(err error) string {
|
|
|
|
var e *Error
|
|
|
|
if err == nil {
|
|
|
|
return ""
|
|
|
|
} else if errors.As(err, &e) {
|
|
|
|
return e.Err.Error()
|
|
|
|
}
|
|
|
|
return "Internal error."
|
|
|
|
}
|
|
|
|
|
|
|
|
// Errorf is a helper function to return an Error with a given code and error.
|
|
|
|
func Errorf(code Code, err error) *Error {
|
|
|
|
return &Error{
|
|
|
|
Code: code,
|
|
|
|
Err: err,
|
|
|
|
}
|
|
|
|
}
|