use crate::canister_api::methods::method_names::LIST;
use crate::canister_api::types::{asset::AssetDetails, list::ListAssetsRequest};
use candid::Nat;
use ic_agent::AgentError;
use ic_utils::Canister;
use ic_utils::call::SyncCall;
use std::collections::HashMap;
pub async fn list_assets(
canister: &Canister<'_>,
) -> Result<HashMap<String, AssetDetails>, AgentError> {
let mut all_entries: Vec<AssetDetails> = Vec::new();
let mut start = 0u64;
let mut prev_page_size: Option<usize> = None;
loop {
let (entries,): (Vec<AssetDetails>,) = canister
.query(LIST)
.with_arg(ListAssetsRequest {
start: Some(Nat::from(start)),
length: None,
})
.build()
.call()
.await?;
let num_entries = entries.len();
if num_entries == 0 {
break;
}
if start > 0 && entries == all_entries {
break;
}
start += num_entries as u64;
all_entries.extend(entries);
if let Some(prev_size) = prev_page_size {
if num_entries < prev_size {
break;
}
}
prev_page_size = Some(num_entries);
}
let assets: HashMap<_, _> = all_entries
.into_iter()
.map(|d| (d.key.clone(), d))
.collect();
Ok(assets)
}