From e0a422fd1668282d6018575a72dd8fd6fb4ce716 Mon Sep 17 00:00:00 2001 From: withchao <993506633@qq.com> Date: Mon, 20 Mar 2023 14:36:42 +0800 Subject: [PATCH] code error --- pkg/errs/code.go | 2 +- pkg/errs/coderr.go | 17 ++++++++++++++--- pkg/errs/predefine.go | 2 +- pkg/errs/relation.go | 43 +++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 59 insertions(+), 5 deletions(-) create mode 100644 pkg/errs/relation.go diff --git a/pkg/errs/code.go b/pkg/errs/code.go index 166cbd3b9..36c0e2e81 100644 --- a/pkg/errs/code.go +++ b/pkg/errs/code.go @@ -48,7 +48,7 @@ const ( // 群组错误码 GroupIDNotFoundError = 1201 //GroupID不存在 - GroupIDIDExisted = 1202 //GroupID已存在 + GroupIDExisted = 1202 //GroupID已存在 OnlyOneOwnerError = 1203 //只能有一个群主 InGroupAlreadyError = 1204 //已在群组中 NotInGroupYetError = 1205 //不在群组中 diff --git a/pkg/errs/coderr.go b/pkg/errs/coderr.go index 1ce329905..445ee0ddd 100644 --- a/pkg/errs/coderr.go +++ b/pkg/errs/coderr.go @@ -11,7 +11,8 @@ type CodeError interface { Msg() string Detail() string WithDetail(detail string) CodeError - Is(err error) bool + // Is 判断是否是某个错误, loose为false时, 只有错误码相同就认为是同一个错误, 默认为true + Is(err error, loose ...bool) bool Wrap(msg ...string) error error } @@ -59,13 +60,23 @@ func (e *codeError) Wrap(w ...string) error { return errors.Wrap(e, strings.Join(w, ", ")) } -func (e *codeError) Is(err error) bool { +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 { - return codeErr.Code() == e.code + if allowSubclasses { + return Relation.Is(e.code, codeErr.Code()) + } else { + return codeErr.Code() == e.code + } } return false } diff --git a/pkg/errs/predefine.go b/pkg/errs/predefine.go index e18cdf4eb..6ba2f76f8 100644 --- a/pkg/errs/predefine.go +++ b/pkg/errs/predefine.go @@ -12,7 +12,7 @@ var ( ErrUserIDNotFound = NewCodeError(UserIDNotFoundError, "UserIDNotFoundError") ErrGroupIDNotFound = NewCodeError(GroupIDNotFoundError, "GroupIDNotFoundError") - ErrGroupIDExisted = NewCodeError(GroupIDIDExisted, "GroupIDExisted") + ErrGroupIDExisted = NewCodeError(GroupIDExisted, "GroupIDExisted") ErrUserIDExisted = NewCodeError(UserIDExisted, "UserIDExisted") ErrRecordNotFound = NewCodeError(RecordNotFoundError, "RecordNotFoundError") diff --git a/pkg/errs/relation.go b/pkg/errs/relation.go new file mode 100644 index 000000000..5d87ab59e --- /dev/null +++ b/pkg/errs/relation.go @@ -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 +}