Skip to content

Commit ce7f78d

Browse files
committed
[patch] added Is & Unwrap methods for the error type
1 parent d26515a commit ce7f78d

File tree

2 files changed

+126
-0
lines changed

2 files changed

+126
-0
lines changed

errors.go

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,24 @@ func (e *Error) Message() string {
9898
return e.message
9999
}
100100

101+
// Unwrap implement's Go 1.13's Unwrap interface exposing the wrapped error
102+
func (e *Error) Unwrap() error {
103+
if e.original == nil {
104+
return nil
105+
}
106+
107+
return e.original
108+
}
109+
110+
// Is implements the Is interface required by Go
111+
func (e *Error) Is(err error) bool {
112+
o, _ := err.(*Error)
113+
if o == nil {
114+
return false
115+
}
116+
return o == e
117+
}
118+
101119
// HTTPStatusCode is a convenience method used to get the appropriate HTTP response status code for the respective error type
102120
func (e *Error) HTTPStatusCode() int {
103121
status := http.StatusInternalServerError

mirror_test.go

Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
package errors
2+
3+
import (
4+
"errors"
5+
"testing"
6+
)
7+
8+
func TestUnwrap(t *testing.T) {
9+
type args struct {
10+
err error
11+
}
12+
tests := []struct {
13+
name string
14+
args args
15+
wantErr bool
16+
}{
17+
{
18+
name: "wrapped",
19+
args: args{err: NewWithErrMsgType(
20+
New("level 0"),
21+
"level 1",
22+
TypeInternal,
23+
)},
24+
wantErr: true,
25+
},
26+
{
27+
name: "no wrapping",
28+
args: args{err: NewWithErrMsgType(
29+
nil,
30+
"level 1",
31+
TypeInternal,
32+
)},
33+
wantErr: false,
34+
},
35+
}
36+
for _, tt := range tests {
37+
t.Run(tt.name, func(t *testing.T) {
38+
if err := Unwrap(tt.args.err); (err != nil) != tt.wantErr {
39+
t.Errorf("Unwrap() error = %v, wantErr %v", err, tt.wantErr)
40+
}
41+
})
42+
}
43+
}
44+
45+
func TestIs(t *testing.T) {
46+
target := New("level 0")
47+
type args struct {
48+
err error
49+
target error
50+
}
51+
tests := []struct {
52+
name string
53+
args args
54+
want bool
55+
}{
56+
{
57+
name: "has err in the chain",
58+
args: args{
59+
err: NewWithErrMsgType(
60+
NewWithErrMsgType(
61+
target,
62+
"level 1",
63+
TypeInputBody,
64+
),
65+
"level 2",
66+
TypeNotFound,
67+
),
68+
target: target,
69+
},
70+
want: true,
71+
},
72+
{
73+
name: "no matching err in the chain",
74+
args: args{
75+
err: NewWithErrMsgType(
76+
NewWithErrMsgType(
77+
New("level 0"),
78+
"level 1",
79+
TypeInputBody,
80+
),
81+
"level 2",
82+
TypeNotFound,
83+
),
84+
target: target,
85+
},
86+
want: false,
87+
},
88+
{
89+
name: "external target error",
90+
args: args{
91+
err: NewWithErrMsgType(
92+
nil,
93+
"level 2",
94+
TypeNotFound,
95+
),
96+
target: errors.New("external"),
97+
},
98+
want: false,
99+
},
100+
}
101+
for _, tt := range tests {
102+
t.Run(tt.name, func(t *testing.T) {
103+
if got := Is(tt.args.err, tt.args.target); got != tt.want {
104+
t.Errorf("Is() = %v, want %v", got, tt.want)
105+
}
106+
})
107+
}
108+
}

0 commit comments

Comments
 (0)