-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdefaults.go
More file actions
139 lines (123 loc) · 3.8 KB
/
defaults.go
File metadata and controls
139 lines (123 loc) · 3.8 KB
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
package pocket
import (
"context"
"sync"
"time"
)
// globalDefaults holds the default configuration for all nodes.
var globalDefaults = &nodeDefaults{
prep: defaultPrep,
exec: defaultExec,
post: defaultPost,
retryDelay: 100 * time.Millisecond,
}
// nodeDefaults contains default configuration that can be applied to nodes.
type nodeDefaults struct {
mu sync.RWMutex
// Lifecycle defaults
prep PrepFunc
exec ExecFunc
post PostFunc
// Options defaults
maxRetries int
retryDelay time.Duration
timeout time.Duration
onError func(error)
fallback func(ctx context.Context, input any, err error) (any, error)
onSuccess func(ctx context.Context, store StoreWriter, output any)
onFailure func(ctx context.Context, store StoreWriter, err error)
onComplete func(ctx context.Context, store StoreWriter)
}
// SetDefaults configures global defaults for all nodes.
func SetDefaults(opts ...Option) {
globalDefaults.mu.Lock()
defer globalDefaults.mu.Unlock()
// Create a temporary nodeOptions to apply options to
tempOpts := nodeOptions{
prep: globalDefaults.prep,
exec: globalDefaults.exec,
post: globalDefaults.post,
maxRetries: globalDefaults.maxRetries,
retryDelay: globalDefaults.retryDelay,
timeout: globalDefaults.timeout,
onError: globalDefaults.onError,
fallback: globalDefaults.fallback,
onSuccess: globalDefaults.onSuccess,
onFailure: globalDefaults.onFailure,
onComplete: globalDefaults.onComplete,
}
// Apply options
for _, opt := range opts {
opt(&tempOpts)
}
// Copy back to globalDefaults
if tempOpts.prep != nil {
globalDefaults.prep = tempOpts.prep
}
if tempOpts.exec != nil {
globalDefaults.exec = tempOpts.exec
}
if tempOpts.post != nil {
globalDefaults.post = tempOpts.post
}
globalDefaults.maxRetries = tempOpts.maxRetries
globalDefaults.retryDelay = tempOpts.retryDelay
globalDefaults.timeout = tempOpts.timeout
globalDefaults.onError = tempOpts.onError
globalDefaults.fallback = tempOpts.fallback
globalDefaults.onSuccess = tempOpts.onSuccess
globalDefaults.onFailure = tempOpts.onFailure
globalDefaults.onComplete = tempOpts.onComplete
}
// SetDefaultPrep sets the global default prep function.
func SetDefaultPrep(fn PrepFunc) {
globalDefaults.mu.Lock()
defer globalDefaults.mu.Unlock()
globalDefaults.prep = fn
}
// SetDefaultExec sets the global default exec function.
func SetDefaultExec(fn ExecFunc) {
globalDefaults.mu.Lock()
defer globalDefaults.mu.Unlock()
globalDefaults.exec = fn
}
// SetDefaultPost sets the global default post function.
func SetDefaultPost(fn PostFunc) {
globalDefaults.mu.Lock()
defer globalDefaults.mu.Unlock()
globalDefaults.post = fn
}
// getDefaults returns a copy of the current global defaults.
func getDefaults() (prep PrepFunc, exec ExecFunc, post PostFunc, opts nodeOptions) {
globalDefaults.mu.RLock()
defer globalDefaults.mu.RUnlock()
return globalDefaults.prep,
globalDefaults.exec,
globalDefaults.post,
nodeOptions{
maxRetries: globalDefaults.maxRetries,
retryDelay: globalDefaults.retryDelay,
timeout: globalDefaults.timeout,
onError: globalDefaults.onError,
fallback: globalDefaults.fallback,
onSuccess: globalDefaults.onSuccess,
onFailure: globalDefaults.onFailure,
onComplete: globalDefaults.onComplete,
}
}
// ResetDefaults resets all global defaults to their initial values.
func ResetDefaults() {
globalDefaults.mu.Lock()
defer globalDefaults.mu.Unlock()
globalDefaults.prep = defaultPrep
globalDefaults.exec = defaultExec
globalDefaults.post = defaultPost
globalDefaults.maxRetries = 0
globalDefaults.retryDelay = 100 * time.Millisecond
globalDefaults.timeout = 0
globalDefaults.onError = nil
globalDefaults.fallback = nil
globalDefaults.onSuccess = nil
globalDefaults.onFailure = nil
globalDefaults.onComplete = nil
}