Skip to content

Commit 2b66712

Browse files
committed
Handle nil receiver in DataError.Unwrap safely
1 parent d3752a4 commit 2b66712

2 files changed

Lines changed: 46 additions & 0 deletions

File tree

error.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,10 @@ func (e *DataError) WithCause(err error) *DataError {
130130
// Unwrap returns the cause if one was set via WithCause; otherwise it returns
131131
// the underlying error created by New, Newf, or Wrap.
132132
func (e *DataError) Unwrap() error {
133+
if e == nil {
134+
return nil
135+
}
136+
133137
if e.cause != nil {
134138
return e.cause
135139
}

wrap_test.go

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,13 @@ func TestWrapUnwrap(t *testing.T) {
1414

1515
assert.Equal(t, Unwrap(outer), inner)
1616
assert.Equal(t, Unwrap(inner), nil)
17+
assert.Equal(t, Unwrap(nil), nil)
18+
19+
var err *DataError
20+
assert.Equal(t, Unwrap(err), nil)
21+
22+
var errs *MultiError
23+
assert.Equal(t, Unwrap(errs), nil)
1724
}
1825

1926
func TestWrapIs(t *testing.T) {
@@ -22,6 +29,13 @@ func TestWrapIs(t *testing.T) {
2229

2330
assert.True(t, Is(outer, inner))
2431
assert.False(t, Is(outer, errors.New("other")))
32+
assert.False(t, Is(nil, inner))
33+
34+
var err *DataError
35+
assert.False(t, Is(err, inner))
36+
37+
var errs *MultiError
38+
assert.False(t, Is(errs, inner))
2539
}
2640

2741
func TestWrapAs(t *testing.T) {
@@ -31,4 +45,32 @@ func TestWrapAs(t *testing.T) {
3145
var target *DataError
3246
assert.True(t, As(wrapped, &target))
3347
assert.Equal(t, target, original)
48+
49+
assert.False(t, As(nil, &target))
50+
51+
var nilErr *DataError
52+
assert.True(t, As(nilErr, &target))
53+
assert.Equal(t, target, nilErr)
54+
55+
var multiTarget *MultiError
56+
var nilMulti *MultiError
57+
assert.True(t, As(nilMulti, &multiTarget))
58+
assert.Equal(t, multiTarget, nilMulti)
59+
}
60+
61+
func TestWrapAsType(t *testing.T) {
62+
original := New("test").WithField("k", "v")
63+
wrapped := fmt.Errorf("wrapped: %w", original)
64+
65+
target, ok := AsType[*DataError](wrapped)
66+
assert.True(t, ok)
67+
assert.Equal(t, target, original)
68+
69+
_, ok = AsType[*DataError](nil)
70+
assert.False(t, ok)
71+
72+
var nilErr *DataError
73+
nilTarget, ok := AsType[*DataError](nilErr)
74+
assert.True(t, ok)
75+
assert.Equal(t, nilTarget, nilErr)
3476
}

0 commit comments

Comments
 (0)