-
Notifications
You must be signed in to change notification settings - Fork 0
/
errors.go
58 lines (52 loc) · 1.18 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
package drivers
import (
"strings"
"unicode"
)
// Error is a wrapper to standardize errors.
type Error struct {
Driver string
Err error
}
// WrapErr wraps an error using the specified driver when err is not nil.
func WrapErr(driver string, err error) error {
if err == nil {
return nil
}
// avoid double wrapping error
if _, ok := err.(*Error); ok {
return err
}
return &Error{driver, err}
}
// Error satisfies the error interface, returning simple information about the
// wrapped error in standardized way.
func (e *Error) Error() string {
if d, ok := drivers[e.Driver]; ok {
n := e.Driver
if d.Name != "" {
n = d.Name
}
s := n
var msg string
if d.Err != nil {
var code string
code, msg = d.Err(e.Err)
if code != "" {
s += ": " + code
}
} else {
msg = e.Err.Error()
}
return s + ": " + chop(msg, n)
}
return e.Driver + ": " + chop(e.Err.Error(), e.Driver)
}
// Unwrap returns the original error.
func (e *Error) Unwrap() error {
return e.Err
}
// chop chops off a "prefix: " prefix from a string.
func chop(s, prefix string) string {
return strings.TrimLeftFunc(strings.TrimPrefix(strings.TrimSpace(s), prefix+":"), unicode.IsSpace)
}