Skip to content

Commit 4048dd2

Browse files
Add ErrorObject.Is method (#25)
* Add ErrorObject.Is method * Fix ErrorObject.Is logic * Improve test coverage for ErrorObject.Is
1 parent a8f3252 commit 4048dd2

File tree

2 files changed

+52
-0
lines changed

2 files changed

+52
-0
lines changed

error.go

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,33 @@ func (e ErrorObject) Error() string {
112112
return res.String()
113113
}
114114

115+
// Is checks if this error matches the supplied error.
116+
// If err is not an ErrorObject, it always returns false.
117+
// It returns true if Code() and Message() are the same.
118+
// If err.Params() is non-nil, we also check that all the params match.
119+
// This way, we can check an error against a sentinel error, such as ErrLengthTooLong.
120+
func (e ErrorObject) Is(err error) bool {
121+
eo, ok := err.(ErrorObject)
122+
if !ok {
123+
return false
124+
}
125+
126+
if e.message != eo.message || e.code != eo.code {
127+
return false
128+
}
129+
130+
if len(eo.params) == 0 {
131+
return true
132+
}
133+
134+
for k, v := range e.params {
135+
if eo.params[k] != v {
136+
return false
137+
}
138+
}
139+
return true
140+
}
141+
115142
// Error returns the error string of Errors.
116143
func (es Errors) Error() string {
117144
if len(es) == 0 {

error_test.go

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,31 @@ func TestErrorObject_Params(t *testing.T) {
128128
assert.Equal(t, err.Params(), p)
129129
}
130130

131+
func TestErrorObject_Is(t *testing.T) {
132+
err := ErrLengthOutOfRange.(ErrorObject)
133+
err = err.SetParams(map[string]interface{}{"mix": 3, "max": 6}).(ErrorObject)
134+
135+
assert.True(t, err.Is(ErrLengthOutOfRange))
136+
assert.True(t, errors.Is(err, ErrLengthOutOfRange))
137+
138+
err2 := ErrLengthOutOfRange.(ErrorObject)
139+
err2 = err2.SetParams(map[string]interface{}{"min": 3, "max": 9}).(ErrorObject)
140+
141+
assert.False(t, err2.Is(err))
142+
assert.False(t, errors.Is(err2, err))
143+
144+
assert.False(t, err.Is(errors.New(err.message)))
145+
146+
err3 := ErrorObject{code: err.code, message: "hello"}
147+
assert.False(t, err.Is(err3))
148+
149+
err4 := ErrorObject{code: "test_error", message: err.message}
150+
assert.False(t, err.Is(err4))
151+
152+
err5 := ErrorObject{code: err.code, message: err.message, params: err.params}
153+
assert.True(t, err.Is(err5))
154+
}
155+
131156
func TestErrorObject_AddParam2(t *testing.T) {
132157
p := map[string]interface{}{"key": "val"}
133158
err := NewError("code", "A").(ErrorObject)

0 commit comments

Comments
 (0)