mithril_cardano_node_chain/chain_scanner/
block_scanner.rs1use 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
16pub struct CardanoBlockScanner {
20 chain_reader: Arc<Mutex<dyn ChainBlockReader>>,
21 max_roll_forwards_per_poll: usize,
22 logger: Logger,
23}
24
25impl CardanoBlockScanner {
26 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}