-
Notifications
You must be signed in to change notification settings - Fork 0
/
error.go
140 lines (117 loc) · 2.32 KB
/
error.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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
package serrs
import (
"errors"
"fmt"
)
var _ error = (*simpleError)(nil)
var _ fmt.Formatter = (*simpleError)(nil)
var _ fmt.Stringer = (*simpleError)(nil)
var _ fmt.GoStringer = (*simpleError)(nil)
// simpleError is a simple implementation of the error interface.
type simpleError struct {
// message is the error message
message string
// code is the error code
// optional
code Code
// cause is the cause of the error
cause error
// frames is the location where the error occurred
frames Frames
// data is the custom data attached to the error
data CustomData
}
func newSimpleError(msg string, skip int) *simpleError {
e := new(simpleError)
e.message = msg
e.frames = caller(skip + 1)
return e
}
func asSimpleError(err error) *simpleError {
if err == nil {
return nil
}
var e *simpleError
if errors.As(err, &e) {
return e
}
return nil
}
func (s *simpleError) Error() string {
if s.cause == nil {
if s.message != "" {
return s.message
}
return ""
}
if s.message == "" {
return s.cause.Error()
}
return s.message + ": " + s.cause.Error()
}
func (s *simpleError) Is(target error) bool {
if targetErr := asSimpleError(target); targetErr != nil {
targetCode := targetErr.getCode()
sCode := s.getCode()
if targetCode != nil && sCode != nil {
return targetCode.ErrorCode() == sCode.ErrorCode()
}
}
return false
}
func (s *simpleError) Unwrap() error {
return s.cause
}
func (s *simpleError) String() string {
return s.Error()
}
func (s *simpleError) GoString() string {
return s.Error()
}
func (s *simpleError) errorSurface() string {
if s == nil {
return ""
}
if s.message != "" {
return s.message
}
if cause := asSimpleError(s.cause); cause != nil {
return cause.errorSurface()
} else if s.cause != nil {
return s.cause.Error()
}
return ""
}
func (s *simpleError) withCode(code Code) error {
if s == nil {
return nil
}
s.code = code
return s
}
func (s *simpleError) getCode() Code {
if s == nil {
return nil
}
if s.code != nil {
return s.code
}
if next := asSimpleError(s.cause); next != nil {
return next.getCode()
}
return nil
}
func (s *simpleError) withData(data CustomData) error {
if s == nil {
return nil
}
s.data = data
return s
}
func (s *simpleError) withMessage(msg string) error {
if s == nil {
return nil
}
s.message = msg
return s
}