/
parameters.go
251 lines (221 loc) · 7.75 KB
/
parameters.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
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
// Copyright © 2021 Weald Technology Trading.
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package batch
import (
"errors"
"time"
execclient "github.com/attestantio/go-execution-client"
"github.com/rs/zerolog"
"github.com/wealdtech/execd/services/execdb"
"github.com/wealdtech/execd/services/metrics"
"github.com/wealdtech/execd/services/scheduler"
)
type parameters struct {
logLevel zerolog.Level
monitor metrics.Service
scheduler scheduler.Service
chainHeightProvider execclient.ChainHeightProvider
blocksProvider execclient.BlocksProvider
blockReplaysProvider execclient.BlockReplaysProvider
issuanceProvider execclient.IssuanceProvider
transactionReceiptsProvider execclient.TransactionReceiptsProvider
blocksSetter execdb.BlocksSetter
transactionsSetter execdb.TransactionsSetter
transactionStateDiffsSetter execdb.TransactionStateDiffsSetter
eventsSetter execdb.EventsSetter
trackDistance uint32
startHeight int64
enableTransactions bool
enableTransactionEvents bool
enableBalanceChanges bool
enableStorageChanges bool
processConcurrency int64
interval time.Duration
}
// Parameter is the interface for service parameters.
type Parameter interface {
apply(*parameters)
}
type parameterFunc func(*parameters)
func (f parameterFunc) apply(p *parameters) {
f(p)
}
// WithLogLevel sets the log level for the module.
func WithLogLevel(logLevel zerolog.Level) Parameter {
return parameterFunc(func(p *parameters) {
p.logLevel = logLevel
})
}
// WithMonitor sets the monitor for the module.
func WithMonitor(monitor metrics.Service) Parameter {
return parameterFunc(func(p *parameters) {
p.monitor = monitor
})
}
// WithScheduler sets the scheduler for the module.
func WithScheduler(scheduler scheduler.Service) Parameter {
return parameterFunc(func(p *parameters) {
p.scheduler = scheduler
})
}
// WithChainHeightProvider sets the chain height provider for this module.
func WithChainHeightProvider(provider execclient.ChainHeightProvider) Parameter {
return parameterFunc(func(p *parameters) {
p.chainHeightProvider = provider
})
}
// WithBlocksProvider sets the blocks provider for this module.
func WithBlocksProvider(provider execclient.BlocksProvider) Parameter {
return parameterFunc(func(p *parameters) {
p.blocksProvider = provider
})
}
// WithBlockReplaysProvider sets the block replays provider for this module.
func WithBlockReplaysProvider(provider execclient.BlockReplaysProvider) Parameter {
return parameterFunc(func(p *parameters) {
p.blockReplaysProvider = provider
})
}
// WithIssuanceProvider sets the issuance provider for this module.
func WithIssuanceProvider(provider execclient.IssuanceProvider) Parameter {
return parameterFunc(func(p *parameters) {
p.issuanceProvider = provider
})
}
// WithTransactionReceiptsProvider sets the tranasaction receipts provider for this module.
func WithTransactionReceiptsProvider(provider execclient.TransactionReceiptsProvider) Parameter {
return parameterFunc(func(p *parameters) {
p.transactionReceiptsProvider = provider
})
}
// WithBlocksSetter sets the blocks setter for this module.
func WithBlocksSetter(setter execdb.BlocksSetter) Parameter {
return parameterFunc(func(p *parameters) {
p.blocksSetter = setter
})
}
// WithTransactionsSetter sets the transactions setter for this module.
func WithTransactionsSetter(setter execdb.TransactionsSetter) Parameter {
return parameterFunc(func(p *parameters) {
p.transactionsSetter = setter
})
}
// WithTransactionStateDiffsSetter sets the block transactions changes setter for this module.
func WithTransactionStateDiffsSetter(setter execdb.TransactionStateDiffsSetter) Parameter {
return parameterFunc(func(p *parameters) {
p.transactionStateDiffsSetter = setter
})
}
// WithEventsSetter sets the events setter for this module.
func WithEventsSetter(setter execdb.EventsSetter) Parameter {
return parameterFunc(func(p *parameters) {
p.eventsSetter = setter
})
}
// WithTrackDistance sets the track distance for this module.
func WithTrackDistance(trackDistance uint32) Parameter {
return parameterFunc(func(p *parameters) {
p.trackDistance = trackDistance
})
}
// WithStartHeight sets the start height for this module.
func WithStartHeight(startHeight int64) Parameter {
return parameterFunc(func(p *parameters) {
p.startHeight = startHeight
})
}
// WithTransactions sets the storage of transaction data.
func WithTransactions(enable bool) Parameter {
return parameterFunc(func(p *parameters) {
p.enableTransactions = enable
})
}
// WithTransactionEvents sets the storage of transaction event data.
func WithTransactionEvents(enable bool) Parameter {
return parameterFunc(func(p *parameters) {
p.enableTransactionEvents = enable
})
}
// WithBalanceChanges sets the storage of balance change data.
func WithBalanceChanges(enable bool) Parameter {
return parameterFunc(func(p *parameters) {
p.enableBalanceChanges = enable
})
}
// WithStorageChanges sets the storage of storage change data.
func WithStorageChanges(enable bool) Parameter {
return parameterFunc(func(p *parameters) {
p.enableStorageChanges = enable
})
}
// WithProcessConcurrency sets the concurrency for the service.
func WithProcessConcurrency(concurrency int64) Parameter {
return parameterFunc(func(p *parameters) {
p.processConcurrency = concurrency
})
}
// WithInterval sets the interval between updates.
func WithInterval(interval time.Duration) Parameter {
return parameterFunc(func(p *parameters) {
p.interval = interval
})
}
// parseAndCheckParameters parses and checks parameters to ensure that mandatory parameters are present and correct.
func parseAndCheckParameters(params ...Parameter) (*parameters, error) {
parameters := parameters{
logLevel: zerolog.GlobalLevel(),
}
for _, p := range params {
if params != nil {
p.apply(¶meters)
}
}
if parameters.scheduler == nil {
return nil, errors.New("no scheduler specified")
}
if parameters.chainHeightProvider == nil {
return nil, errors.New("no chain height provider specified")
}
if parameters.blocksProvider == nil {
return nil, errors.New("no blocks provider specified")
}
if parameters.blockReplaysProvider == nil {
return nil, errors.New("no block replays provider specified")
}
// Issuance provider is allowed to be nil.
if parameters.transactionReceiptsProvider == nil {
return nil, errors.New("no transaction receipts provider specified")
}
if parameters.blocksSetter == nil {
return nil, errors.New("no blocks setter specified")
}
if parameters.transactionsSetter == nil {
return nil, errors.New("no transactions setter specified")
}
if parameters.transactionStateDiffsSetter == nil {
return nil, errors.New("no transaction state differences setter specified")
}
if parameters.eventsSetter == nil {
return nil, errors.New("no events setter specified")
}
if parameters.trackDistance == 0 {
return nil, errors.New("no track distance specified")
}
if parameters.processConcurrency == 0 {
return nil, errors.New("no process concurrency specified")
}
if parameters.interval == 0 {
return nil, errors.New("no interval specified")
}
return ¶meters, nil
}