parent
ce7ae6a9b9
commit
e1f5b2afe0
@ -0,0 +1,109 @@
|
||||
package errs
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"github.com/pkg/errors"
|
||||
"strings"
|
||||
)
|
||||
|
||||
type CodeError interface {
|
||||
Code() int
|
||||
Msg() string
|
||||
Detail() string
|
||||
WithDetail(detail string) CodeError
|
||||
// Is 判断是否是某个错误, loose为false时, 只有错误码相同就认为是同一个错误, 默认为true
|
||||
Is(err error, loose ...bool) bool
|
||||
Wrap(msg ...string) error
|
||||
error
|
||||
}
|
||||
|
||||
func NewCodeError(code int, msg string) CodeError {
|
||||
return &codeError{
|
||||
code: code,
|
||||
msg: msg,
|
||||
}
|
||||
}
|
||||
|
||||
type codeError struct {
|
||||
code int
|
||||
msg string
|
||||
detail string
|
||||
}
|
||||
|
||||
func (e *codeError) Code() int {
|
||||
return e.code
|
||||
}
|
||||
|
||||
func (e *codeError) Msg() string {
|
||||
return e.msg
|
||||
}
|
||||
|
||||
func (e *codeError) Detail() string {
|
||||
return e.detail
|
||||
}
|
||||
|
||||
func (e *codeError) WithDetail(detail string) CodeError {
|
||||
var d string
|
||||
if e.detail == "" {
|
||||
d = detail
|
||||
} else {
|
||||
d = e.detail + ", " + detail
|
||||
}
|
||||
return &codeError{
|
||||
code: e.code,
|
||||
msg: e.msg,
|
||||
detail: d,
|
||||
}
|
||||
}
|
||||
|
||||
func (e *codeError) Wrap(w ...string) error {
|
||||
return errors.Wrap(e, strings.Join(w, ", "))
|
||||
}
|
||||
|
||||
func (e *codeError) Is(err error, loose ...bool) bool {
|
||||
if err == nil {
|
||||
return false
|
||||
}
|
||||
var allowSubclasses bool
|
||||
if len(loose) == 0 {
|
||||
allowSubclasses = true
|
||||
} else {
|
||||
allowSubclasses = loose[0]
|
||||
}
|
||||
codeErr, ok := Unwrap(err).(CodeError)
|
||||
if ok {
|
||||
if allowSubclasses {
|
||||
return Relation.Is(e.code, codeErr.Code())
|
||||
} else {
|
||||
return codeErr.Code() == e.code
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func (e *codeError) Error() string {
|
||||
return fmt.Sprintf("%s", e.msg)
|
||||
}
|
||||
|
||||
func Unwrap(err error) error {
|
||||
for err != nil {
|
||||
unwrap, ok := err.(interface {
|
||||
Unwrap() error
|
||||
})
|
||||
if !ok {
|
||||
break
|
||||
}
|
||||
err = unwrap.Unwrap()
|
||||
}
|
||||
return err
|
||||
}
|
||||
|
||||
func Wrap(err error, msg ...string) error {
|
||||
if err == nil {
|
||||
return nil
|
||||
}
|
||||
if len(msg) == 0 {
|
||||
return errors.WithStack(err)
|
||||
}
|
||||
return errors.Wrap(err, strings.Join(msg, ", "))
|
||||
}
|
@ -0,0 +1,67 @@
|
||||
package errs
|
||||
|
||||
var (
|
||||
ErrArgs = NewCodeError(ArgsError, "ArgsError")
|
||||
ErrDatabase = NewCodeError(DatabaseError, "DatabaseError")
|
||||
ErrInternalServer = NewCodeError(ServerInternalError, "ServerInternalError")
|
||||
ErrNetwork = NewCodeError(NetworkError, "NetworkError")
|
||||
ErrNoPermission = NewCodeError(NoPermissionError, "NoPermissionError")
|
||||
ErrIdentity = NewCodeError(IdentityError, "IdentityError")
|
||||
ErrCallback = NewCodeError(CallbackError, "CallbackError")
|
||||
ErrCallbackContinue = NewCodeError(CallbackError, "ErrCallbackContinue")
|
||||
|
||||
ErrUserIDNotFound = NewCodeError(UserIDNotFoundError, "UserIDNotFoundError")
|
||||
ErrGroupIDNotFound = NewCodeError(GroupIDNotFoundError, "GroupIDNotFoundError")
|
||||
ErrGroupIDExisted = NewCodeError(GroupIDExisted, "GroupIDExisted")
|
||||
ErrUserIDExisted = NewCodeError(UserIDExisted, "UserIDExisted")
|
||||
|
||||
ErrRecordNotFound = NewCodeError(RecordNotFoundError, "RecordNotFoundError")
|
||||
|
||||
ErrRelationshipAlready = NewCodeError(RelationshipAlreadyError, "RelationshipAlreadyError")
|
||||
ErrNotRelationshipYet = NewCodeError(NotRelationshipYetError, "NotRelationshipYetError")
|
||||
ErrCanNotAddYourself = NewCodeError(CanNotAddYourselfError, "CanNotAddYourselfError")
|
||||
|
||||
ErrOnlyOneOwner = NewCodeError(OnlyOneOwnerError, "OnlyOneOwnerError")
|
||||
ErrInGroupAlready = NewCodeError(InGroupAlreadyError, "InGroupAlreadyError")
|
||||
ErrNotInGroupYet = NewCodeError(NotInGroupYetError, "NotInGroupYetError")
|
||||
ErrDismissedAlready = NewCodeError(DismissedAlreadyError, "DismissedAlreadyError")
|
||||
ErrOwnerNotAllowedQuit = NewCodeError(OwnerNotAllowedQuitError, "OwnerNotAllowedQuitError")
|
||||
ErrRegisteredAlready = NewCodeError(RegisteredAlreadyError, "RegisteredAlreadyError")
|
||||
ErrGroupTypeNotSupport = NewCodeError(GroupTypeNotSupport, "")
|
||||
ErrGroupNoOwner = NewCodeError(GroupNoOwner, "ErrGroupNoOwner")
|
||||
|
||||
ErrDefaultOther = NewCodeError(DefaultOtherError, "DefaultOtherError")
|
||||
ErrData = NewCodeError(DataError, "DataError")
|
||||
ErrTokenExpired = NewCodeError(TokenExpiredError, "TokenExpiredError")
|
||||
ErrTokenInvalid = NewCodeError(TokenInvalidError, "TokenInvalidError") //
|
||||
ErrTokenMalformed = NewCodeError(TokenMalformedError, "TokenMalformedError") //格式错误
|
||||
ErrTokenNotValidYet = NewCodeError(TokenNotValidYetError, "TokenNotValidYetError") //还未生效
|
||||
ErrTokenUnknown = NewCodeError(TokenUnknownError, "TokenUnknownError") //未知错误
|
||||
ErrTokenKicked = NewCodeError(TokenKickedError, "TokenKickedError")
|
||||
ErrTokenNotExist = NewCodeError(TokenNotExistError, "TokenNotExistError") //在redis中不存在
|
||||
ErrTokenDifferentPlatformID = NewCodeError(TokenDifferentPlatformIDError, "TokenDifferentPlatformIDError")
|
||||
ErrTokenDifferentUserID = NewCodeError(TokenDifferentUserIDError, "TokenDifferentUserIDError")
|
||||
ErrDuplicateKey = NewCodeError(DuplicateKeyError, "DuplicateKeyError")
|
||||
|
||||
ErrMessageHasReadDisable = NewCodeError(MessageHasReadDisable, "MessageHasReadDisable")
|
||||
|
||||
ErrBlockedByPeer = NewCodeError(BlockedByPeer, "BlockedByPeer")
|
||||
//不是对方的好友
|
||||
ErrNotPeersFriend = NewCodeError(NotPeersFriend, "NotPeersFriend")
|
||||
|
||||
ErrMutedInGroup = NewCodeError(MutedInGroup, "MutedInGroup")
|
||||
ErrMutedGroup = NewCodeError(MutedGroup, "MutedGroup")
|
||||
ErrUserNotRecvMsg = NewCodeError(UserNotRecvMsg, "UserNotRecvMsg")
|
||||
ErrMsgAlreadyRevoke = NewCodeError(MsgAlreadyRevoke, "MsgAlreadyRevoke")
|
||||
|
||||
ErrConnOverMaxNumLimit = NewCodeError(ConnOverMaxNumLimit, "ConnOverMaxNumLimit")
|
||||
|
||||
ErrConnArgsErr = NewCodeError(ConnArgsErr, "args err, need token, sendID, platformID")
|
||||
ErrConnUpdateErr = NewCodeError(ConnArgsErr, "upgrade http conn err")
|
||||
|
||||
ErrConfig = NewCodeError(ConfigError, "ConfigError")
|
||||
|
||||
ErrFileUploadedComplete = NewCodeError(FileUploadedCompleteError, "FileUploadedComplete")
|
||||
ErrFileUploadedExpired = NewCodeError(FileUploadedExpiredError, "FileUploadedExpiredError")
|
||||
ErrGroupRequestHandled = NewCodeError(GroupRequestHandled, "GroupRequestHandled")
|
||||
)
|
@ -0,0 +1,43 @@
|
||||
package errs
|
||||
|
||||
var Relation = &relation{m: make(map[int]map[int]struct{})}
|
||||
|
||||
func init() {
|
||||
Relation.Add(RecordNotFoundError, UserIDNotFoundError)
|
||||
Relation.Add(RecordNotFoundError, GroupIDNotFoundError)
|
||||
Relation.Add(DuplicateKeyError, UserIDExisted)
|
||||
Relation.Add(DuplicateKeyError, GroupIDExisted)
|
||||
}
|
||||
|
||||
type relation struct {
|
||||
m map[int]map[int]struct{}
|
||||
}
|
||||
|
||||
func (r *relation) Add(codes ...int) {
|
||||
if len(codes) < 2 {
|
||||
panic("codes length must be greater than 2")
|
||||
}
|
||||
for i := 1; i < len(codes); i++ {
|
||||
parent := codes[i-1]
|
||||
s, ok := r.m[parent]
|
||||
if !ok {
|
||||
s = make(map[int]struct{})
|
||||
r.m[parent] = s
|
||||
}
|
||||
for _, code := range codes[i:] {
|
||||
s[code] = struct{}{}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (r *relation) Is(parent, child int) bool {
|
||||
if parent == child {
|
||||
return true
|
||||
}
|
||||
s, ok := r.m[parent]
|
||||
if !ok {
|
||||
return false
|
||||
}
|
||||
_, ok = s[child]
|
||||
return ok
|
||||
}
|
Loading…
Reference in new issue