From 294ccdeb257203af1ba82cadf6af211b50a00738 Mon Sep 17 00:00:00 2001 From: Dan Jones Date: Tue, 30 Sep 2025 15:49:36 -0500 Subject: [PATCH 1/3] Add ErrorObject.Is method --- error.go | 27 +++++++++++++++++++++++++++ error_test.go | 14 ++++++++++++++ 2 files changed, 41 insertions(+) diff --git a/error.go b/error.go index e75b1de..7b675b4 100644 --- a/error.go +++ b/error.go @@ -112,6 +112,33 @@ func (e ErrorObject) Error() string { return res.String() } +// Is checks if this error matches the supplied error. +// If err is not an ErrorObject, it always returns false. +// It returns true if Code() and Message() are the same. +// If err.Params() is non-nil, we also check that all the params match. +// This way, we can check an error against a sentinel error, such as ErrLengthTooLong. +func (e ErrorObject) Is(err error) bool { + eo, ok := err.(ErrorObject) + if !ok { + return false + } + + if e.message != eo.message && e.code != eo.code { + return false + } + + if len(eo.params) == 0 { + return true + } + + for k, v := range e.params { + if eo.params[k] != v { + return false + } + } + return true +} + // Error returns the error string of Errors. func (es Errors) Error() string { if len(es) == 0 { diff --git a/error_test.go b/error_test.go index e0985c5..cf0b2c8 100644 --- a/error_test.go +++ b/error_test.go @@ -115,6 +115,20 @@ func TestErrorObject_Params(t *testing.T) { assert.Equal(t, err.Params(), p) } +func TestErrorObject_Is(t *testing.T) { + err := ErrLengthOutOfRange.(ErrorObject) + err = err.SetParams(map[string]interface{}{"mix": 3, "max": 6}).(ErrorObject) + + assert.True(t, err.Is(ErrLengthOutOfRange)) + assert.True(t, errors.Is(err, ErrLengthOutOfRange)) + + err2 := ErrLengthOutOfRange.(ErrorObject) + err2 = err2.SetParams(map[string]interface{}{"min": 3, "max": 9}).(ErrorObject) + + assert.False(t, err2.Is(err)) + assert.False(t, errors.Is(err2, err)) +} + func TestErrorObject_AddParam2(t *testing.T) { p := map[string]interface{}{"key": "val"} err := NewError("code", "A").(ErrorObject) From 27de8ddbc472d3828eb31059f890ac54d32983a8 Mon Sep 17 00:00:00 2001 From: Dan Jones Date: Wed, 1 Oct 2025 08:14:57 -0500 Subject: [PATCH 2/3] Fix ErrorObject.Is logic --- error.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/error.go b/error.go index 7b675b4..71a9a53 100644 --- a/error.go +++ b/error.go @@ -123,7 +123,7 @@ func (e ErrorObject) Is(err error) bool { return false } - if e.message != eo.message && e.code != eo.code { + if e.message != eo.message || e.code != eo.code { return false } From 94ad41fe668ae115fe07daaf4ef90058fb8d2447 Mon Sep 17 00:00:00 2001 From: Dan Jones Date: Wed, 1 Oct 2025 08:15:27 -0500 Subject: [PATCH 3/3] Improve test coverage for ErrorObject.Is --- error_test.go | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/error_test.go b/error_test.go index cf0b2c8..afc86e2 100644 --- a/error_test.go +++ b/error_test.go @@ -127,6 +127,17 @@ func TestErrorObject_Is(t *testing.T) { assert.False(t, err2.Is(err)) assert.False(t, errors.Is(err2, err)) + + assert.False(t, err.Is(errors.New(err.message))) + + err3 := ErrorObject{code: err.code, message: "hello"} + assert.False(t, err.Is(err3)) + + err4 := ErrorObject{code: "test_error", message: err.message} + assert.False(t, err.Is(err4)) + + err5 := ErrorObject{code: err.code, message: err.message, params: err.params} + assert.True(t, err.Is(err5)) } func TestErrorObject_AddParam2(t *testing.T) {