diff --git a/errors/errors.go b/errors/errors.go index 2ca8d59e..0a16c85b 100644 --- a/errors/errors.go +++ b/errors/errors.go @@ -233,6 +233,27 @@ func Equal(err1 error, err2 error) bool { return true } +// CodeIn return true if err has specified code +func CodeIn(err interface{}, codes ...int32) bool { + var code int32 + switch verr := err.(type) { + case *Error: + code = verr.Code + case int32: + code = verr + default: + return false + } + + for _, check := range codes { + if code == check { + return true + } + } + + return false +} + // FromError try to convert go error to *Error func FromError(err error) *Error { if verr, ok := err.(*Error); ok && verr != nil { diff --git a/errors/errors_test.go b/errors/errors_test.go index 85a5a3d3..7b35ee42 100644 --- a/errors/errors_test.go +++ b/errors/errors_test.go @@ -96,3 +96,20 @@ func TestErrors(t *testing.T) { } } } + + +func TestCodeIn(t *testing.T) { + err := InternalServerError("id", "%s", "msg") + + if ok := CodeIn(err, 400, 500); !ok { + t.Fatalf("CodeIn not works: %v", err) + } + + if ok := CodeIn(err.(*Error).Code, 500); !ok { + t.Fatalf("CodeIn not works: %v", err) + } + + if ok := CodeIn(err, 100); ok { + t.Fatalf("CodeIn not works: %v", err) + } +} \ No newline at end of file