Source file
src/errors/wrap.go
1
2
3
4
5 package errors
6
7 import (
8 "internal/reflectlite"
9 )
10
11
12
13
14
15
16 func Unwrap(err error) error {
17 u, ok := err.(interface {
18 Unwrap() error
19 })
20 if !ok {
21 return nil
22 }
23 return u.Unwrap()
24 }
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43 func Is(err, target error) bool {
44 if target == nil {
45 return err == target
46 }
47
48 isComparable := reflectlite.TypeOf(target).Comparable()
49 for {
50 if isComparable && err == target {
51 return true
52 }
53 if x, ok := err.(interface{ Is(error) bool }); ok && x.Is(target) {
54 return true
55 }
56 switch x := err.(type) {
57 case interface{ Unwrap() error }:
58 err = x.Unwrap()
59 if err == nil {
60 return false
61 }
62 case interface{ Unwrap() []error }:
63 for _, err := range x.Unwrap() {
64 if Is(err, target) {
65 return true
66 }
67 }
68 return false
69 default:
70 return false
71 }
72 }
73 }
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92 func As(err error, target any) bool {
93 if err == nil {
94 return false
95 }
96 if target == nil {
97 panic("errors: target cannot be nil")
98 }
99 val := reflectlite.ValueOf(target)
100 typ := val.Type()
101 if typ.Kind() != reflectlite.Ptr || val.IsNil() {
102 panic("errors: target must be a non-nil pointer")
103 }
104 targetType := typ.Elem()
105 if targetType.Kind() != reflectlite.Interface && !targetType.Implements(errorType) {
106 panic("errors: *target must be interface or implement error")
107 }
108 for {
109 if reflectlite.TypeOf(err).AssignableTo(targetType) {
110 val.Elem().Set(reflectlite.ValueOf(err))
111 return true
112 }
113 if x, ok := err.(interface{ As(any) bool }); ok && x.As(target) {
114 return true
115 }
116 switch x := err.(type) {
117 case interface{ Unwrap() error }:
118 err = x.Unwrap()
119 if err == nil {
120 return false
121 }
122 case interface{ Unwrap() []error }:
123 for _, err := range x.Unwrap() {
124 if As(err, target) {
125 return true
126 }
127 }
128 return false
129 default:
130 return false
131 }
132 }
133 }
134
135 var errorType = reflectlite.TypeOf((*error)(nil)).Elem()
136
View as plain text