use crate::report::ReportDataSource;
use crate::sns::report::SnsReportContext;
use crate::sns::report::{
SNS_NEURON_DETAIL_REPORT_SCHEMA_VERSION, SnsHostError, SnsNeuronDetailReport, SnsNeuronRequest,
live::LiveSnsSource,
source::{SnsNeuronSource, sns_neuron_id_from_text, validate_mainnet_sns_neuron},
target::resolve_neuron_target,
};
pub async fn build_sns_neuron_detail_report(
request: &SnsNeuronRequest,
) -> Result<SnsNeuronDetailReport, SnsHostError> {
build_sns_neuron_detail_report_with_source(request, &LiveSnsSource::default()).await
}
pub async fn build_sns_neuron_detail_report_with_source(
request: &SnsNeuronRequest,
source: &dyn SnsNeuronSource,
) -> Result<SnsNeuronDetailReport, SnsHostError> {
sns_neuron_id_from_text(&request.neuron_id)?;
let lookup = resolve_neuron_target(&request.target)?;
let neuron = source
.fetch_sns_neuron(
&lookup.fetch_request,
&lookup.governance_canister_id,
&request.neuron_id,
)
.await?;
validate_mainnet_sns_neuron(&neuron, &request.neuron_id)?;
Ok(SnsNeuronDetailReport {
schema_version: SNS_NEURON_DETAIL_REPORT_SCHEMA_VERSION,
context: SnsReportContext::from_live(lookup.fetch_request, lookup.governance_canister_id),
neuron_id: request.neuron_id.clone(),
data_source: ReportDataSource::Live,
neuron,
})
}