-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy patherrors.go
More file actions
112 lines (89 loc) · 1.62 KB
/
Copy patherrors.go
File metadata and controls
112 lines (89 loc) · 1.62 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
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
package go2errorsinspection
import (
"errors"
"fmt"
"reflect"
)
type Wrapper interface {
Unwrap() error
}
func Is(err, target error) bool {
for {
if err == target {
return true
}
wrapper, ok := err.(Wrapper)
if !ok {
return false
}
if err = wrapper.Unwrap(); err == nil {
return false
}
}
}
func AsValue(target interface{}, err error) bool {
v := reflect.ValueOf(target)
if v.Type().Kind() != reflect.Ptr {
panic("non-pointer passed to AsValue")
}
v = v.Elem()
vt := v.Type()
for {
et := reflect.TypeOf(err)
if et == vt || vt.Kind() == reflect.Interface && et.Implements(vt) {
v.Set(reflect.ValueOf(err))
return true
}
wrapper, ok := err.(Wrapper)
if !ok {
return false
}
if err = wrapper.Unwrap(); err == nil {
return false
}
}
}
type errWrapper struct {
err error
wrapped error
}
func (ew *errWrapper) Error() string {
if ew.wrapped == nil {
return ew.err.Error()
}
return fmt.Sprintf("%s: %s", ew.err, ew.wrapped)
}
func (ew *errWrapper) Unwrap() error {
return ew.wrapped
}
func WithError(wrapped error, err error) error {
if wrapped == nil {
return nil
}
if err == nil {
return wrapped
}
return &errWrapper{
err: err,
wrapped: wrapped,
}
}
type ErrText struct {
Text string
Wrapped error
}
func (et *ErrText) Error() string {
if et.Wrapped == nil {
return et.Text
}
return fmt.Sprintf("%s: %s", et.Text, et.Wrapped)
}
func (et *ErrText) Unwrap() error {
return et.Wrapped
}
func New(text string) error {
return errors.New(text)
}
func Errorf(format string, args ...interface{}) error {
return fmt.Errorf(format, args...)
}