Skip to main content

tycho_collator/internal_queue/state/
shard_iterator.rs

1use 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}