-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathwrapwithfuncparams.go
140 lines (116 loc) · 3.61 KB
/
wrapwithfuncparams.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 errs
/*
Call argument parameters are available on the stack,
but in a platform dependent packed format and not directly accessible
via package runtime.
Could only be parsed from runtime.Stack() result text.
See https://www.ardanlabs.com/blog/2015/01/stack-traces-in-go.html
*/
func wrapWithFuncParamsSkip(skip int, err error, params ...any) *withCallStackFuncParams {
switch w := err.(type) {
case callStackParamsProvider:
// OK, wrap the wrapped
case callStackProvider:
// Already wrapped with stack,
// replace wrapper wrapWithStackParams
return &withCallStackFuncParams{
withCallStack: withCallStack{
err: w.Unwrap(),
callStack: w.CallStack(),
},
params: params,
}
}
return &withCallStackFuncParams{
withCallStack: withCallStack{
err: err,
callStack: callStack(skip + 1),
},
params: params,
}
}
func WrapWithFuncParamsSkip(skip int, resultVar *error, params ...any) {
if *resultVar != nil {
*resultVar = wrapWithFuncParamsSkip(1+skip, *resultVar, params...)
}
}
func WrapWithFuncParams(resultVar *error, params ...any) {
if *resultVar != nil {
*resultVar = wrapWithFuncParamsSkip(1, *resultVar, params...)
}
}
func WrapWith0FuncParams(resultVar *error) {
if *resultVar != nil {
*resultVar = wrapWithFuncParamsSkip(1, *resultVar)
}
}
func WrapWith1FuncParam(resultVar *error, p0 any) {
if *resultVar != nil {
*resultVar = wrapWithFuncParamsSkip(1, *resultVar, p0)
}
}
func WrapWith2FuncParams(resultVar *error, p0, p1 any) {
if *resultVar != nil {
*resultVar = wrapWithFuncParamsSkip(1, *resultVar, p0, p1)
}
}
func WrapWith3FuncParams(resultVar *error, p0, p1, p2 any) {
if *resultVar != nil {
*resultVar = wrapWithFuncParamsSkip(1, *resultVar, p0, p1, p2)
}
}
func WrapWith4FuncParams(resultVar *error, p0, p1, p2, p3 any) {
if *resultVar != nil {
*resultVar = wrapWithFuncParamsSkip(1, *resultVar, p0, p1, p2, p3)
}
}
func WrapWith5FuncParams(resultVar *error, p0, p1, p2, p3, p4 any) {
if *resultVar != nil {
*resultVar = wrapWithFuncParamsSkip(1, *resultVar, p0, p1, p2, p3, p4)
}
}
func WrapWith6FuncParams(resultVar *error, p0, p1, p2, p3, p4, p5 any) {
if *resultVar != nil {
*resultVar = wrapWithFuncParamsSkip(1, *resultVar, p0, p1, p2, p3, p4, p5)
}
}
func WrapWith7FuncParams(resultVar *error, p0, p1, p2, p3, p4, p5, p6 any) {
if *resultVar != nil {
*resultVar = wrapWithFuncParamsSkip(1, *resultVar, p0, p1, p2, p3, p4, p5, p6)
}
}
func WrapWith8FuncParams(resultVar *error, p0, p1, p2, p3, p4, p5, p6, p7 any) {
if *resultVar != nil {
*resultVar = wrapWithFuncParamsSkip(1, *resultVar, p0, p1, p2, p3, p4, p5, p6, p7)
}
}
func WrapWith9FuncParams(resultVar *error, p0, p1, p2, p3, p4, p5, p6, p7, p8 any) {
if *resultVar != nil {
*resultVar = wrapWithFuncParamsSkip(1, *resultVar, p0, p1, p2, p3, p4, p5, p6, p7, p8)
}
}
func WrapWith10FuncParams(resultVar *error, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9 any) {
if *resultVar != nil {
*resultVar = wrapWithFuncParamsSkip(1, *resultVar, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9)
}
}
type callStackParamsProvider interface {
callStackProvider
CallStackParams() ([]uintptr, []any)
}
var (
_ error = &withCallStackFuncParams{}
_ callStackProvider = &withCallStackFuncParams{}
_ callStackParamsProvider = &withCallStackFuncParams{}
)
// withCallStackFuncParams is an error wrapper that implements callStackParamsProvider
type withCallStackFuncParams struct {
withCallStack
params []any
}
func (w *withCallStackFuncParams) Error() string {
return formatError(w)
}
func (w *withCallStackFuncParams) CallStackParams() ([]uintptr, []any) {
return w.callStack, w.params
}