sidechain_block_search/
impl_compare_strategy.rs1use super::*;
4
5impl<Block, BlockInfo> CompareStrategy<Block, BlockInfo> for AnyBlockInEpoch
6where
7 Block: BlockT,
8 BlockInfo: SidechainInfo<Block>,
9{
10 type Error = BlockInfo::Error;
11
12 fn compare_block(
13 &self,
14 block: NumberFor<Block>,
15 block_info: &BlockInfo,
16 ) -> Result<Ordering, Self::Error> {
17 let epoch_block = block_info.get_epoch_of_block(block)?;
18 Ok(epoch_block.cmp(&self.epoch))
19 }
20}
21
22impl<Block, BlockInfo> CompareStrategy<Block, BlockInfo> for LastBlockInEpoch
23where
24 Block: BlockT,
25 BlockInfo: SidechainInfo<Block>,
26{
27 type Error = BlockInfo::Error;
28
29 fn compare_block(
30 &self,
31 block: NumberFor<Block>,
32 block_info: &BlockInfo,
33 ) -> Result<Ordering, Self::Error> {
34 let epoch_block = block_info.get_epoch_of_block(block)?;
35 let ordering = match epoch_block.cmp(&self.epoch) {
36 Ordering::Equal => {
37 match block_info.get_epoch_of_block(block + 1u32.into())?.cmp(&self.epoch) {
38 Ordering::Greater => Ordering::Equal,
39 _ => Ordering::Less,
40 }
41 },
42 ordering => ordering,
43 };
44 Ok(ordering)
45 }
46}
47
48impl<Block, BlockInfo> CompareStrategy<Block, BlockInfo> for AnyBlockInSlotRange
49where
50 Block: BlockT,
51 BlockInfo: SidechainInfo<Block>,
52{
53 type Error = BlockInfo::Error;
54
55 fn compare_block(
56 &self,
57 block: NumberFor<Block>,
58 block_info: &BlockInfo,
59 ) -> Result<Ordering, Self::Error> {
60 let slot_of_block = block_info.get_slot_of_block(block)?;
61 let ordering = if slot_of_block.0 < self.slot_range.start.0 {
62 Ordering::Less
63 } else if slot_of_block.0 >= self.slot_range.end.0 {
64 Ordering::Greater
65 } else {
66 Ordering::Equal
67 };
68
69 Ok(ordering)
70 }
71}
72
73impl<Block, BlockInfo> CompareStrategy<Block, BlockInfo> for LatestBlockInSlotRange<Block>
74where
75 Block: BlockT,
76 BlockInfo: SidechainInfo<Block>,
77{
78 type Error = BlockInfo::Error;
79
80 fn compare_block(
81 &self,
82 block: NumberFor<Block>,
83 block_info: &BlockInfo,
84 ) -> Result<Ordering, Self::Error> {
85 let current_block_ordering = AnyBlockInSlotRange { slot_range: self.slot_range.clone() }
86 .compare_block(block, block_info)?;
87 let ordering = match current_block_ordering {
88 Ordering::Equal => {
89 if block < self.latest_block {
90 let next_block_ordering =
91 AnyBlockInSlotRange { slot_range: self.slot_range.clone() }
92 .compare_block(block + 1u32.into(), block_info)?;
93 match next_block_ordering {
94 Ordering::Greater => Ordering::Equal,
95 _ => Ordering::Less,
96 }
97 } else {
98 Ordering::Equal
99 }
100 },
101 ordering => ordering,
102 };
103 Ok(ordering)
104 }
105}