use crate::sns::report::{
MainnetSnsProposal, SnsHostError, SnsProposalReport, SnsProposalRequest,
assemble::{
SnsProposalReportContext, SnsProposalReportParts, SnsReportProvenance,
sns_proposal_report_from_parts,
},
cache_storage::load_sns_cache_for_input,
proposals_cache::{model::SnsProposalsCache, paths::SnsProposalsCacheCollection},
};
use std::path::{Path, PathBuf};
pub(in crate::sns::report) fn build_sns_proposal_report_from_cache(
request: &SnsProposalRequest,
cache_root: &Path,
) -> Result<Option<SnsProposalReport>, SnsHostError> {
let (cache_path, cache) = match load_sns_cache_for_input::<SnsProposalsCacheCollection>(
cache_root,
&request.network,
&request.input,
) {
Ok(cache) => cache,
Err(SnsHostError::MissingProposalsCache { .. }) => return Ok(None),
Err(err) => return Err(err),
};
Ok(sns_proposal_report_from_cache(request, cache_path, cache))
}
fn sns_proposal_report_from_cache(
request: &SnsProposalRequest,
cache_path: PathBuf,
cache: SnsProposalsCache,
) -> Option<SnsProposalReport> {
let cache_complete = cache.completeness.is_api_exhausted();
let proposal = cache
.data
.proposals
.into_iter()
.find(|proposal| proposal.proposal_id == request.proposal_id)?;
Some(sns_proposal_report_from_parts(SnsProposalReportParts {
context: SnsProposalReportContext {
network: cache.network,
sns_wasm_canister_id: cache.metadata.sns_wasm_canister_id,
fetched_at: cache.fetched_at,
source_endpoint: cache.source_endpoint,
fetched_by: cache.fetched_by,
id: cache.metadata.id,
name: cache.metadata.name,
root_canister_id: cache.metadata.root_canister_id,
governance_canister_id: cache.metadata.governance_canister_id,
},
proposal_id: request.proposal_id,
verbose: request.verbose,
show_ballots: request.show_ballots,
provenance: SnsReportProvenance::cache(&cache_path, cache_complete),
proposal: MainnetSnsProposal { proposal },
}))
}