use super::{
NNS_NODE_OPERATOR_LIST_REPORT_SCHEMA_VERSION, NnsNodeOperatorHostError,
NnsNodeOperatorListReport,
};
use crate::report::CollectionSourceRequest;
use crate::{
ic_registry::{MainnetNodeOperatorList, fetch_mainnet_node_operator_list},
nns::{LiveNnsSource, source::mainnet_registry_fetch_request},
};
pub trait NnsNodeOperatorSource: Sync {
fn fetch_node_operator_list_report<'a>(
&'a self,
request: &'a CollectionSourceRequest,
) -> crate::report::SourceFuture<'a, Result<NnsNodeOperatorListReport, NnsNodeOperatorHostError>>;
}
impl NnsNodeOperatorSource for LiveNnsSource {
fn fetch_node_operator_list_report<'a>(
&'a self,
request: &'a CollectionSourceRequest,
) -> crate::report::SourceFuture<'a, Result<NnsNodeOperatorListReport, NnsNodeOperatorHostError>>
{
Box::pin(async move {
let fetch_request = mainnet_registry_fetch_request(request, |network| {
NnsNodeOperatorHostError::UnsupportedNetwork { network }
})?;
Ok(node_operator_report_from_list(
fetch_mainnet_node_operator_list(&fetch_request).await?,
))
})
}
}
fn node_operator_report_from_list(list: MainnetNodeOperatorList) -> NnsNodeOperatorListReport {
let node_operators = list.node_operators;
NnsNodeOperatorListReport {
schema_version: NNS_NODE_OPERATOR_LIST_REPORT_SCHEMA_VERSION,
provenance: list.provenance,
node_operator_count: node_operators.len(),
node_operators,
}
}