diff --git a/pkg/errs/coderr.go b/pkg/errs/coderr.go new file mode 100644 index 000000000..98ee9a5ca --- /dev/null +++ b/pkg/errs/coderr.go @@ -0,0 +1,80 @@ +package errs + +import ( + "Open_IM/pkg/utils" + "fmt" + "github.com/pkg/errors" + "strings" +) + +type Code interface { + Code() int + Msg() string +} + +type Coderr interface { + Code + Detail() string + WithDetail(string) Coderr + Warp(...string) error + error +} + +func NewCodeError(code int, msg string) Coderr { + return &errInfo{ + code: code, + msg: msg, + } +} + +type errInfo struct { + code int + msg string + detail string +} + +func (e *errInfo) WithDetail(s string) Coderr { + if e.detail == "" { + e.detail = s + } else { + e.detail = s + ", " + e.detail + } + return e +} + +func (e *errInfo) Code() int { + return e.code +} + +func (e *errInfo) Msg() string { + return e.msg +} + +func (e *errInfo) Detail() string { + return e.detail +} + +func (e *errInfo) Warp(w ...string) error { + return errors.Wrap(e, strings.Join(w, ", ")) +} + +func (e *errInfo) Error() string { + return fmt.Sprintf("[%d]%s", e.code, e.msg) +} + +func Unwrap(err error) error { + return utils.Unwrap(err) +} + +func GetCode(err error) Code { + if err == nil { + return NewCodeError(UnknownCode, "nil") + } + if code, ok := Unwrap(err).(Code); ok { + if code.Code() == 0 { + return NewCodeError(UnknownCode, "code == 0") + } + return code + } + return NewCodeError(UnknownCode, "unknown code") +} diff --git a/pkg/errs/define.go b/pkg/errs/define.go new file mode 100644 index 000000000..d31d26f1f --- /dev/null +++ b/pkg/errs/define.go @@ -0,0 +1,4 @@ +package errs + +// UnknownCode 没有解析到code或解析的code=0 +const UnknownCode = 1000