use super::{NNS_NODE_LIST_REPORT_SCHEMA_VERSION, NnsNodeHostError, NnsNodeListReport};
use crate::report::CollectionSourceRequest;
use crate::{
ic_registry::{MainnetNodeList, fetch_mainnet_node_list},
nns::{LiveNnsSource, source::mainnet_registry_fetch_request},
};
pub trait NnsNodeSource: Sync {
fn fetch_node_list_report<'a>(
&'a self,
request: &'a CollectionSourceRequest,
) -> crate::report::SourceFuture<'a, Result<NnsNodeListReport, NnsNodeHostError>>;
}
impl NnsNodeSource for LiveNnsSource {
fn fetch_node_list_report<'a>(
&'a self,
request: &'a CollectionSourceRequest,
) -> crate::report::SourceFuture<'a, Result<NnsNodeListReport, NnsNodeHostError>> {
Box::pin(async move {
let fetch_request = mainnet_registry_fetch_request(request, |network| {
NnsNodeHostError::UnsupportedNetwork { network }
})?;
Ok(node_report_from_list(
fetch_mainnet_node_list(&fetch_request).await?,
))
})
}
}
fn node_report_from_list(list: MainnetNodeList) -> NnsNodeListReport {
let nodes = list.nodes;
NnsNodeListReport {
schema_version: NNS_NODE_LIST_REPORT_SCHEMA_VERSION,
network: list.network,
registry_canister_id: list.registry_canister_id,
registry_version: list.registry_version,
fetched_at: list.fetched_at,
source_endpoint: list.source_endpoint,
fetched_by: list.fetched_by,
node_count: nodes.len(),
nodes,
}
}