everscale_network/util/
network_builder.rs1use anyhow::Result;
2use frunk_core::hlist::{HCons, HNil};
3
4pub struct NetworkBuilder<T, I>(pub(crate) T, pub(crate) std::marker::PhantomData<I>);
6
7impl<T, I> NetworkBuilder<T, I>
8where
9 T: DeferredInitializationList,
10{
11 pub fn build(self) -> Result<T::Output> {
13 self.0.initialize()
14 }
15}
16
17pub trait DeferredInitialization {
19 type Initialized;
20
21 fn initialize(self) -> Result<Self::Initialized>;
22}
23
24pub trait DeferredInitializationList {
26 type Output;
27
28 fn initialize(self) -> Result<Self::Output>;
29}
30
31type BaseLayer<T> = HCons<T, HNil>;
32
33impl<T0> DeferredInitializationList for BaseLayer<T0>
34where
35 T0: DeferredInitialization,
36{
37 type Output = T0::Initialized;
38
39 fn initialize(self) -> Result<Self::Output> {
40 self.head.initialize()
41 }
42}
43
44impl<T0, T1> DeferredInitializationList for HCons<T1, BaseLayer<T0>>
45where
46 T0: DeferredInitialization,
47 T1: DeferredInitialization,
48{
49 type Output = (T0::Initialized, T1::Initialized);
50
51 fn initialize(self) -> Result<Self::Output> {
52 let t1 = self.head.initialize()?;
53 let t0 = self.tail.head.initialize()?;
54 Ok((t0, t1))
55 }
56}
57
58impl<T0, T1, T2> DeferredInitializationList for HCons<T2, HCons<T1, BaseLayer<T0>>>
59where
60 T0: DeferredInitialization,
61 T1: DeferredInitialization,
62 T2: DeferredInitialization,
63{
64 type Output = (T0::Initialized, T1::Initialized, T2::Initialized);
65
66 fn initialize(self) -> Result<Self::Output> {
67 let t2 = self.head.initialize()?;
68 let t1 = self.tail.head.initialize()?;
69 let t0 = self.tail.tail.head.initialize()?;
70 Ok((t0, t1, t2))
71 }
72}
73
74impl<T0, T1, T2, T3> DeferredInitializationList for HCons<T3, HCons<T2, HCons<T1, BaseLayer<T0>>>>
75where
76 T0: DeferredInitialization,
77 T1: DeferredInitialization,
78 T2: DeferredInitialization,
79 T3: DeferredInitialization,
80{
81 type Output = (
82 T0::Initialized,
83 T1::Initialized,
84 T2::Initialized,
85 T3::Initialized,
86 );
87
88 fn initialize(self) -> Result<Self::Output> {
89 let t3 = self.head.initialize()?;
90 let t2 = self.tail.head.initialize()?;
91 let t1 = self.tail.tail.head.initialize()?;
92 let t0 = self.tail.tail.tail.head.initialize()?;
93 Ok((t0, t1, t2, t3))
94 }
95}