mithril_common/cardano_block_scanner/
block_scanner.rs

1use std::sync::Arc;
2
3use async_trait::async_trait;
4use slog::Logger;
5use tokio::sync::Mutex;
6
7use crate::cardano_block_scanner::{BlockScanner, BlockStreamer, RawCardanoPoint};
8use crate::chain_reader::ChainBlockReader;
9use crate::entities::BlockNumber;
10use crate::StdResult;
11
12use super::ChainReaderBlockStreamer;
13
14/// Cardano block scanner
15///
16/// This scanner reads the blocks with a chain block reader
17pub struct CardanoBlockScanner {
18    chain_reader: Arc<Mutex<dyn ChainBlockReader>>,
19    max_roll_forwards_per_poll: usize,
20    logger: Logger,
21}
22
23impl CardanoBlockScanner {
24    /// Factory
25    pub fn new(
26        chain_reader: Arc<Mutex<dyn ChainBlockReader>>,
27        max_roll_forwards_per_poll: usize,
28        logger: Logger,
29    ) -> Self {
30        Self {
31            chain_reader,
32            max_roll_forwards_per_poll,
33            logger,
34        }
35    }
36}
37
38#[async_trait]
39impl BlockScanner for CardanoBlockScanner {
40    async fn scan(
41        &self,
42        from: Option<RawCardanoPoint>,
43        until: BlockNumber,
44    ) -> StdResult<Box<dyn BlockStreamer>> {
45        Ok(Box::new(
46            ChainReaderBlockStreamer::try_new(
47                self.chain_reader.clone(),
48                from,
49                until,
50                self.max_roll_forwards_per_poll,
51                self.logger.clone(),
52            )
53            .await?,
54        ))
55    }
56}