tycho_collator/internal_queue/state/
shard_iterator.rs1use anyhow::Result;
2use tycho_block_util::queue::QueueKey;
3use tycho_types::models::ShardIdent;
4
5use crate::storage::iterator::InternalQueueMessagesIter;
6use crate::types::ShortAddr;
7
8pub enum IterResult<'a> {
9 Value(&'a [u8]),
10 Skip(Option<(ShardIdent, QueueKey)>),
11}
12
13pub struct ShardIterator {
14 receiver: ShardIdent,
15 iterator: InternalQueueMessagesIter,
16}
17
18impl ShardIterator {
19 pub fn new(receiver: ShardIdent, mut iterator: InternalQueueMessagesIter) -> Self {
20 iterator.seek_to_first();
21
22 Self { receiver, iterator }
23 }
24
25 #[allow(clippy::should_implement_trait)]
26 pub fn next(&mut self) -> Result<Option<IterResult<'_>>> {
27 let Some(msg) = self.iterator.next()? else {
28 return Ok(None);
29 };
30
31 let short_addr = ShortAddr::new(msg.workchain as i32, msg.prefix);
32
33 Ok(Some(if self.receiver.contains_address(&short_addr) {
34 IterResult::Value(msg.message_boc)
35 } else {
36 IterResult::Skip(Some((msg.key.shard_ident, msg.key.internal_message_key)))
37 }))
38 }
39}