-
Notifications
You must be signed in to change notification settings - Fork 15
/
errors.go
96 lines (77 loc) · 2.1 KB
/
errors.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
package errors
import (
gerrors "errors"
"fmt"
bugsnagerrors "github.com/bugsnag/bugsnag-go/v2/errors"
)
func New(text string) error {
return bugsnagerrors.New(text, 1)
}
func NewSentinelError(text string) error {
return gerrors.New(text)
}
func Errorf(format string, a ...any) error {
return bugsnagerrors.New(fmt.Errorf(format, a...), 1)
}
func ErrorfWithSkip(skip int, format string, a ...any) error {
return bugsnagerrors.New(fmt.Errorf(format, a...), 1+skip)
}
func As(err error, target interface{}) bool {
// This handles the case where another error wraps our *bugsnagerrors.Error. We try to call `As`
// at each step, and recursively unwrap until we can no longer do it. Similar to the original `As` logic.
// See test TestThirdpartyWrapOnOurWrap
for err != nil {
if bugsnagErr, ok := err.(*bugsnagerrors.Error); ok {
if gerrors.As(bugsnagErr.Err, target) {
return true
}
}
if gerrors.As(err, target) {
return true
}
err = Unwrap(err)
}
return false
}
// Is detects whether the error is equal to a given error. Errors
// are considered equal by this function if they are matched by errors.Is
// or if their contained errors are matched through errors.Is
func Is(e error, original error) bool {
for e != nil {
if gerrors.Is(e, original) {
return true
}
if bugsnagErr, ok := e.(*bugsnagerrors.Error); ok {
return Is(bugsnagErr.Err, original)
}
if bugsnagErr, ok := Unwrap(e).(*bugsnagerrors.Error); ok {
return Is(bugsnagErr.Err, original)
}
if original, ok := original.(*bugsnagerrors.Error); ok {
return Is(e, original.Err)
}
e = Unwrap(e)
}
return false
}
func Unwrap(err error) error {
if bugsnagErr, ok := err.(*bugsnagerrors.Error); ok {
return bugsnagErr.Err
}
if bugsnagErr, ok := gerrors.Unwrap(err).(*bugsnagerrors.Error); ok {
return bugsnagErr.Err
}
return gerrors.Unwrap(err)
}
func wrapImpl(err error, skip int) error {
if err == nil {
return nil
}
return bugsnagerrors.New(err, skip+1)
}
func Wrap(err error) error {
return wrapImpl(err, 1)
}
func WrapWithSkip(err error, skip int) error {
return wrapImpl(err, skip+1)
}