mithril_aggregator/services/
aggregator_client.rs

1use async_trait::async_trait;
2
3use mithril_aggregator_client::{
4    AggregatorHttpClient,
5    query::{GetCertificateQuery, GetCertificatesListQuery, GetEpochSettingsQuery},
6};
7use mithril_common::{StdResult, entities::Certificate, messages::TryFromMessageAdapter};
8
9use crate::entities::LeaderAggregatorEpochSettings;
10use crate::message_adapters::FromEpochSettingsAdapter;
11use crate::services::{LeaderAggregatorClient, RemoteCertificateRetriever};
12
13#[async_trait]
14impl LeaderAggregatorClient for AggregatorHttpClient {
15    async fn retrieve_epoch_settings(&self) -> StdResult<Option<LeaderAggregatorEpochSettings>> {
16        let epoch_settings = self.send(GetEpochSettingsQuery::current()).await?;
17        FromEpochSettingsAdapter::try_adapt(epoch_settings).map(Some)
18    }
19}
20
21#[async_trait]
22impl RemoteCertificateRetriever for AggregatorHttpClient {
23    async fn get_latest_certificate_details(&self) -> StdResult<Option<Certificate>> {
24        let latest_certificates_list = self.send(GetCertificatesListQuery::latest()).await?;
25
26        match latest_certificates_list.first() {
27            None => Ok(None),
28            Some(latest_certificate_list_item) => {
29                let latest_certificate_message = self
30                    .send(GetCertificateQuery::by_hash(
31                        &latest_certificate_list_item.hash,
32                    ))
33                    .await?;
34                latest_certificate_message.map(TryInto::try_into).transpose()
35            }
36        }
37    }
38
39    async fn get_genesis_certificate_details(&self) -> StdResult<Option<Certificate>> {
40        match self.send(GetCertificateQuery::latest_genesis()).await? {
41            Some(message) => Ok(Some(message.try_into()?)),
42            None => Ok(None),
43        }
44    }
45}