kabu_core_node/
node.rs

1//! Node types and component set builders
2
3use crate::defaults::{
4    DefaultBroadcaster, DefaultEstimator, DefaultExecutor, DefaultHealthMonitor, DefaultMarket, DefaultMerger, DefaultMonitoring,
5    DefaultNetwork, DefaultSigner, DefaultStrategy,
6};
7use crate::traits::DisabledComponent;
8
9/// Marker type for the Kabu Ethereum node
10pub struct KabuEthereumNode;
11
12/// A set of components that make up a complete node
13pub struct ComponentSet<N, E, S, M, B, Est, H, Mer, Mon, Sig> {
14    pub network: N,
15    pub executor: E,
16    pub strategy: S,
17    pub market: M,
18    pub broadcaster: B,
19    pub estimator: Est,
20    pub health: H,
21    pub merger: Mer,
22    pub monitoring: Mon,
23    pub signer: Sig,
24}
25
26impl KabuEthereumNode {
27    /// Start building components with defaults
28    pub fn components() -> ComponentSetBuilder<
29        DefaultNetwork,
30        DefaultExecutor,
31        DefaultStrategy,
32        DefaultMarket,
33        DefaultBroadcaster,
34        DefaultEstimator,
35        DefaultHealthMonitor,
36        DefaultMerger,
37        DefaultMonitoring,
38        DefaultSigner,
39    > {
40        ComponentSetBuilder {
41            network: DefaultNetwork,
42            executor: DefaultExecutor,
43            strategy: DefaultStrategy,
44            market: DefaultMarket,
45            broadcaster: DefaultBroadcaster,
46            estimator: DefaultEstimator,
47            health: DefaultHealthMonitor,
48            merger: DefaultMerger,
49            monitoring: DefaultMonitoring,
50            signer: DefaultSigner,
51        }
52    }
53}
54
55/// Builder for creating a component set with fluent API
56pub struct ComponentSetBuilder<N, E, S, M, B, Est, H, Mer, Mon, Sig> {
57    network: N,
58    executor: E,
59    strategy: S,
60    market: M,
61    broadcaster: B,
62    estimator: Est,
63    health: H,
64    merger: Mer,
65    monitoring: Mon,
66    signer: Sig,
67}
68
69impl Default
70    for ComponentSetBuilder<
71        DisabledComponent,
72        DisabledComponent,
73        DisabledComponent,
74        DisabledComponent,
75        DisabledComponent,
76        DisabledComponent,
77        DisabledComponent,
78        DisabledComponent,
79        DisabledComponent,
80        DisabledComponent,
81    >
82{
83    fn default() -> Self {
84        Self {
85            network: DisabledComponent,
86            executor: DisabledComponent,
87            strategy: DisabledComponent,
88            market: DisabledComponent,
89            broadcaster: DisabledComponent,
90            estimator: DisabledComponent,
91            health: DisabledComponent,
92            merger: DisabledComponent,
93            monitoring: DisabledComponent,
94            signer: DisabledComponent,
95        }
96    }
97}
98
99impl<N, E, S, M, B, Est, H, Mer, Mon, Sig> ComponentSetBuilder<N, E, S, M, B, Est, H, Mer, Mon, Sig> {
100    /// Replace the network component
101    pub fn network<NewN>(self, network: NewN) -> ComponentSetBuilder<NewN, E, S, M, B, Est, H, Mer, Mon, Sig> {
102        ComponentSetBuilder {
103            network,
104            executor: self.executor,
105            strategy: self.strategy,
106            market: self.market,
107            broadcaster: self.broadcaster,
108            estimator: self.estimator,
109            health: self.health,
110            merger: self.merger,
111            monitoring: self.monitoring,
112            signer: self.signer,
113        }
114    }
115
116    /// Replace the executor component
117    pub fn executor<NewE>(self, executor: NewE) -> ComponentSetBuilder<N, NewE, S, M, B, Est, H, Mer, Mon, Sig> {
118        ComponentSetBuilder {
119            network: self.network,
120            executor,
121            strategy: self.strategy,
122            market: self.market,
123            broadcaster: self.broadcaster,
124            estimator: self.estimator,
125            health: self.health,
126            merger: self.merger,
127            monitoring: self.monitoring,
128            signer: self.signer,
129        }
130    }
131
132    /// Replace the strategy component
133    pub fn strategy<NewS>(self, strategy: NewS) -> ComponentSetBuilder<N, E, NewS, M, B, Est, H, Mer, Mon, Sig> {
134        ComponentSetBuilder {
135            network: self.network,
136            executor: self.executor,
137            strategy,
138            market: self.market,
139            broadcaster: self.broadcaster,
140            estimator: self.estimator,
141            health: self.health,
142            merger: self.merger,
143            monitoring: self.monitoring,
144            signer: self.signer,
145        }
146    }
147
148    /// Replace the market component
149    pub fn market<NewM>(self, market: NewM) -> ComponentSetBuilder<N, E, S, NewM, B, Est, H, Mer, Mon, Sig> {
150        ComponentSetBuilder {
151            network: self.network,
152            executor: self.executor,
153            strategy: self.strategy,
154            market,
155            broadcaster: self.broadcaster,
156            estimator: self.estimator,
157            health: self.health,
158            merger: self.merger,
159            monitoring: self.monitoring,
160            signer: self.signer,
161        }
162    }
163
164    /// Replace the broadcaster component
165    pub fn broadcaster<NewB>(self, broadcaster: NewB) -> ComponentSetBuilder<N, E, S, M, NewB, Est, H, Mer, Mon, Sig> {
166        ComponentSetBuilder {
167            network: self.network,
168            executor: self.executor,
169            strategy: self.strategy,
170            market: self.market,
171            broadcaster,
172            estimator: self.estimator,
173            health: self.health,
174            merger: self.merger,
175            monitoring: self.monitoring,
176            signer: self.signer,
177        }
178    }
179
180    /// Replace the estimator component
181    pub fn estimator<NewEst>(self, estimator: NewEst) -> ComponentSetBuilder<N, E, S, M, B, NewEst, H, Mer, Mon, Sig> {
182        ComponentSetBuilder {
183            network: self.network,
184            executor: self.executor,
185            strategy: self.strategy,
186            market: self.market,
187            broadcaster: self.broadcaster,
188            estimator,
189            health: self.health,
190            merger: self.merger,
191            monitoring: self.monitoring,
192            signer: self.signer,
193        }
194    }
195
196    /// Replace the health monitor component
197    pub fn health<NewH>(self, health: NewH) -> ComponentSetBuilder<N, E, S, M, B, Est, NewH, Mer, Mon, Sig> {
198        ComponentSetBuilder {
199            network: self.network,
200            executor: self.executor,
201            strategy: self.strategy,
202            market: self.market,
203            broadcaster: self.broadcaster,
204            estimator: self.estimator,
205            health,
206            merger: self.merger,
207            monitoring: self.monitoring,
208            signer: self.signer,
209        }
210    }
211
212    /// Replace the merger component
213    pub fn merger<NewMer>(self, merger: NewMer) -> ComponentSetBuilder<N, E, S, M, B, Est, H, NewMer, Mon, Sig> {
214        ComponentSetBuilder {
215            network: self.network,
216            executor: self.executor,
217            strategy: self.strategy,
218            market: self.market,
219            broadcaster: self.broadcaster,
220            estimator: self.estimator,
221            health: self.health,
222            merger,
223            monitoring: self.monitoring,
224            signer: self.signer,
225        }
226    }
227
228    /// Replace the monitoring component
229    pub fn monitoring<NewMon>(self, monitoring: NewMon) -> ComponentSetBuilder<N, E, S, M, B, Est, H, Mer, NewMon, Sig> {
230        ComponentSetBuilder {
231            network: self.network,
232            executor: self.executor,
233            strategy: self.strategy,
234            market: self.market,
235            broadcaster: self.broadcaster,
236            estimator: self.estimator,
237            health: self.health,
238            merger: self.merger,
239            monitoring,
240            signer: self.signer,
241        }
242    }
243
244    /// Replace the signer component
245    pub fn signer<NewSig>(self, signer: NewSig) -> ComponentSetBuilder<N, E, S, M, B, Est, H, Mer, Mon, NewSig> {
246        ComponentSetBuilder {
247            network: self.network,
248            executor: self.executor,
249            strategy: self.strategy,
250            market: self.market,
251            broadcaster: self.broadcaster,
252            estimator: self.estimator,
253            health: self.health,
254            merger: self.merger,
255            monitoring: self.monitoring,
256            signer,
257        }
258    }
259
260    /// Build the final component set
261    pub fn build(self) -> ComponentSet<N, E, S, M, B, Est, H, Mer, Mon, Sig> {
262        ComponentSet {
263            network: self.network,
264            executor: self.executor,
265            strategy: self.strategy,
266            market: self.market,
267            broadcaster: self.broadcaster,
268            estimator: self.estimator,
269            health: self.health,
270            merger: self.merger,
271            monitoring: self.monitoring,
272            signer: self.signer,
273        }
274    }
275}