sidechain_block_search/
impl_compare_strategy.rs

1//! Module contains items that implement the trait `CompareStrategy`
2
3use 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}