Total Lines | 115 |
Duplicated Lines | 0 % |
Coverage | 94.29% |
Changes | 0 |
1 | package errors |
||
2 | |||
3 | import ( |
||
4 | "errors" |
||
5 | "fmt" |
||
6 | "reflect" |
||
7 | ) |
||
8 | |||
9 | type DataError struct { |
||
10 | err error |
||
11 | data map[string]any |
||
12 | cause error |
||
13 | } |
||
14 | |||
15 | func New(text string) *DataError { |
||
16 | 14 | return &DataError{ |
|
17 | err: errors.New(text), |
||
18 | } |
||
19 | } |
||
20 | |||
21 | func Newf(format string, v ...any) *DataError { |
||
22 | 1001 | return &DataError{ |
|
23 | err: fmt.Errorf(format, v...), |
||
24 | } |
||
25 | } |
||
26 | |||
27 | func Wrap(err any) *DataError { |
||
28 | 11 | if err == nil { |
|
29 | return nil |
||
30 | } |
||
31 | |||
32 | 11 | var e error |
|
33 | 11 | switch t := err.(type) { |
|
34 | case *DataError: |
||
35 | 5 | return t |
|
36 | case error: |
||
37 | 5 | e = t |
|
38 | default: |
||
39 | 1 | e = fmt.Errorf("%v", err) |
|
40 | } |
||
41 | |||
42 | 6 | return &DataError{ |
|
43 | err: e, |
||
44 | } |
||
45 | } |
||
46 | |||
47 | func (e *DataError) Error() string { |
||
48 | 28 | return e.err.Error() |
|
49 | } |
||
50 | |||
51 | func (e *DataError) Fields() map[string]any { |
||
52 | 20 | return e.data |
|
53 | } |
||
54 | |||
55 | func (e *DataError) WithField(key string, value any) *DataError { |
||
56 | 15 | return e.WithFields(map[string]any{key: value}) |
|
57 | } |
||
58 | |||
59 | func (e *DataError) WithFields(values map[string]any) *DataError { |
||
60 | 18 | data := make(map[string]any, len(e.data)+len(values)) |
|
61 | 18 | for k, v := range e.data { |
|
62 | 6 | data[k] = v |
|
63 | } |
||
64 | |||
65 | 18 | for k, v := range values { |
|
66 | 18 | if t := reflect.TypeOf(v); t != nil { |
|
67 | 18 | switch { |
|
68 | case t.Kind() == reflect.Func, t.Kind() == reflect.Ptr && t.Elem().Kind() == reflect.Func: |
||
69 | continue |
||
70 | } |
||
71 | } |
||
72 | |||
73 | 18 | data[k] = v |
|
74 | } |
||
75 | |||
76 | 18 | return &DataError{ |
|
77 | err: e.err, |
||
78 | data: data, |
||
79 | cause: e.cause, |
||
80 | } |
||
81 | } |
||
82 | |||
83 | func (e *DataError) WithCause(err error) *DataError { |
||
84 | 1 | return &DataError{ |
|
85 | err: e.err, |
||
86 | data: e.data, |
||
87 | cause: err, |
||
88 | } |
||
89 | } |
||
90 | |||
91 | func (e *DataError) Unwrap() error { |
||
92 | 12 | if e.cause != nil { |
|
93 | 1 | return e.cause |
|
94 | } |
||
95 | |||
96 | 11 | return e.err |
|
97 | } |
||
98 | |||
99 | func (e *DataError) Is(target error) bool { |
||
100 | 14 | err, ok := target.(*DataError) |
|
101 | 14 | if !ok { |
|
102 | 4 | return false |
|
103 | } |
||
104 | |||
105 | 10 | if e.Error() != target.Error() { |
|
106 | 2 | return false |
|
107 | } |
||
108 | |||
109 | 8 | for k, v := range err.Fields() { |
|
110 | 5 | if e.Fields()[k] != v { |
|
111 | 3 | return false |
|
112 | } |
||
113 | } |
||
114 | |||
115 | 5 | return true |
|
116 | } |
||
117 |