-
-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathcompat_before_go26.go
More file actions
56 lines (52 loc) · 1.1 KB
/
compat_before_go26.go
File metadata and controls
56 lines (52 loc) · 1.1 KB
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
//go:build !go1.26
package errors
import "errors"
// Copied from errors/wrap.go available from Go 1.26 on.
func stderrorsAsType[E error](err error) (E, bool) { //nolint:ireturn
if err == nil {
var zero E
return zero, false
}
var pe *E // lazily initialized.
return asType(err, &pe)
}
// Copied from errors/wrap.go available from Go 1.26 on.
func asType[E error](err error, ppe **E) (_ E, _ bool) { //nolint:ireturn
for {
var e E
if errors.As(err, &e) {
return e, true
}
if x, ok := err.(interface{ As(any) bool }); ok { //nolint:inamedparam
if *ppe == nil {
*ppe = new(E)
}
if x.As(*ppe) {
return **ppe, true
}
}
{
var x interface{ Unwrap() error }
var x1 interface{ Unwrap() []error }
switch {
case errors.As(err, &x):
err = x.Unwrap()
if err == nil {
return //nolint:nakedret
}
case errors.As(err, &x1):
for _, err := range x1.Unwrap() {
if err == nil {
continue
}
if x1, ok := asType(err, ppe); ok {
return x1, true
}
}
return //nolint:nakedret
default:
return //nolint:nakedret
}
}
}
}