/
interfaces.go
101 lines (82 loc) · 2.19 KB
/
interfaces.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
package e
import "google.golang.org/grpc/codes"
// ErrVars adds all the returned vars to the current stack frame,
// overriding any existing keys
type ErrVars interface {
ErrVars() map[string]interface{}
}
// ErrTags adds all the returned tags, overriding any existing keys
type ErrTags interface {
ErrTags() map[string]string
}
// ErrMsg sets the error message, overriding any existing message
type ErrMsg interface {
ErrMsg() string
}
// ErrCode sets the error code, overriding any existing code
type ErrCode interface {
ErrCode() codes.Code
}
// ErrLevel sets the error level, adding a var if the level is invalid
type ErrLevel interface {
ErrLevel() Level
}
// ErrRetriable determines if the error is retriable
type ErrRetriable interface {
ErrRetriable() bool
}
// ErrReportable sets whether the error should be reported
type ErrReportable interface {
ErrShouldReport() bool
}
// ErrInfra determines whether an error is infrastructure related
type ErrInfra interface {
ErrIsInfra() bool
}
func getWrapOptionsFromInterfaces(v interface{}) []WrapOption {
var opts []WrapOption
if interfacer, ok := v.(ErrVars); ok {
for k, v := range interfacer.ErrVars() {
opts = append(opts, With(k, v))
}
}
if interfacer, ok := v.(ErrTags); ok {
for k, v := range interfacer.ErrTags() {
opts = append(opts, Tag(k, v))
}
}
if interfacer, ok := v.(ErrMsg); ok {
opts = append(opts, Msg(interfacer.ErrMsg()))
}
if interfacer, ok := v.(ErrCode); ok {
opts = append(opts, Code(interfacer.ErrCode()))
}
if interfacer, ok := v.(ErrRetriable); ok {
if !interfacer.ErrRetriable() {
opts = append(opts, NotRetriable())
}
}
if interfacer, ok := v.(ErrReportable); ok {
if !interfacer.ErrShouldReport() {
opts = append(opts, NoReport())
}
}
if interfacer, ok := v.(ErrInfra); ok {
if !interfacer.ErrIsInfra() {
opts = append(opts, Infra())
}
}
if interfacer, ok := v.(ErrLevel); ok {
switch interfacer.ErrLevel() {
case LevelWarning:
opts = append(opts, Warning())
case LevelError:
opts = append(opts, Error())
case LevelCritical:
opts = append(opts, Critical())
default:
opts = append(opts, With("invalidLevel", interfacer.ErrLevel()))
}
}
return opts
}