use cosmwasm_std::{Deps, Order, StdResult};
use cw_storage_plus::{Bound, Map};
use serde::de::DeserializeOwned;
use serde::Serialize;
const MAX_LIMIT: u32 = 30;
const DEFAULT_LIMIT: u32 = 20;
pub fn query_entry<E, R>(
deps: Deps,
id: u64,
list: &Map<u64, E>,
to_response: fn(E) -> R,
) -> StdResult<R>
where
E: Serialize + DeserializeOwned,
{
let entry = list.load(deps.storage, id)?;
Ok(to_response(entry))
}
pub fn query_list<E>(
deps: Deps,
start_after: Option<u64>,
limit: Option<u32>,
list: &Map<u64, E>,
) -> StdResult<Vec<E>>
where
E: Serialize + DeserializeOwned,
{
let limit = limit.unwrap_or(DEFAULT_LIMIT).min(MAX_LIMIT) as usize;
let start = start_after.map(Bound::exclusive);
let entries: StdResult<Vec<_>> = list
.range(deps.storage, start, None, Order::Ascending)
.take(limit)
.collect();
Ok(entries?.into_iter().map(|l| l.1).collect())
}