mithril_cardano_node_chain/chain_scanner/
block_scanner.rs

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