mithril_aggregator/dependency_injection/builder/support/
compatibility.rs

1use std::sync::Arc;
2
3use mithril_common::api_version::APIVersionProvider;
4use mithril_common::entities::Epoch;
5use mithril_common::era::adapters::{EraReaderAdapterBuilder, EraReaderDummyAdapter};
6use mithril_common::era::{EraChecker, EraMarker, EraReader, EraReaderAdapter, SupportedEra};
7
8use crate::dependency_injection::{DependenciesBuilder, DependenciesBuilderError, Result};
9use crate::get_dependency;
10use crate::ExecutionEnvironment;
11impl DependenciesBuilder {
12    async fn build_api_version_provider(&mut self) -> Result<Arc<APIVersionProvider>> {
13        let api_version_provider = Arc::new(APIVersionProvider::new(self.get_era_checker().await?));
14
15        Ok(api_version_provider)
16    }
17
18    /// [APIVersionProvider] service
19    pub async fn get_api_version_provider(&mut self) -> Result<Arc<APIVersionProvider>> {
20        get_dependency!(self.api_version_provider)
21    }
22
23    async fn build_era_reader(&mut self) -> Result<Arc<EraReader>> {
24        let era_adapter: Arc<dyn EraReaderAdapter> = match self.configuration.environment() {
25            ExecutionEnvironment::Production => EraReaderAdapterBuilder::new(
26                &self.configuration.era_reader_adapter_type(),
27                &self.configuration.era_reader_adapter_params(),
28            )
29            .build(self.get_chain_observer().await?)
30            .map_err(|e| DependenciesBuilderError::Initialization {
31                message: "Could not build EraReader as dependency.".to_string(),
32                error: Some(e.into()),
33            })?,
34            _ => Arc::new(EraReaderDummyAdapter::from_markers(vec![EraMarker::new(
35                &SupportedEra::dummy().to_string(),
36                Some(Epoch(0)),
37            )])),
38        };
39
40        Ok(Arc::new(EraReader::new(era_adapter)))
41    }
42
43    /// [EraReader] service
44    pub async fn get_era_reader(&mut self) -> Result<Arc<EraReader>> {
45        get_dependency!(self.era_reader)
46    }
47
48    async fn build_era_checker(&mut self) -> Result<Arc<EraChecker>> {
49        let current_epoch = self
50            .get_ticker_service()
51            .await?
52            .get_current_epoch()
53            .await
54            .map_err(|e| DependenciesBuilderError::Initialization {
55                message: "Error while building EraChecker".to_string(),
56                error: Some(e),
57            })?;
58        let era_epoch_token = self
59            .get_era_reader()
60            .await?
61            .read_era_epoch_token(current_epoch)
62            .await
63            .map_err(|e| DependenciesBuilderError::Initialization {
64                message: "Error while building EraChecker".to_string(),
65                error: Some(e.into()),
66            })?;
67        let era_checker = Arc::new(EraChecker::new(
68            era_epoch_token.get_current_supported_era().map_err(|e| {
69                DependenciesBuilderError::Initialization {
70                    message: "Error while building EraChecker".to_string(),
71                    error: Some(e),
72                }
73            })?,
74            era_epoch_token.get_current_epoch(),
75        ));
76
77        Ok(era_checker)
78    }
79
80    /// [EraReader] service
81    pub async fn get_era_checker(&mut self) -> Result<Arc<EraChecker>> {
82        get_dependency!(self.era_checker)
83    }
84}