mithril_aggregator/dependency_injection/builder/support/
compatibility.rs

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