You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Open-IM-Server/pkg/errs/coderr.go

81 lines
1.2 KiB

2 years ago
package errs
import (
2 years ago
"OpenIM/pkg/utils"
2 years ago
"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")
}