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;

/// Generic query_entry: loads from `list` and converts via `to_response`.
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))
}

/// Generic query_list: paginates over `list` and returns entries directly.
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())
}

Dimensions

cw-cyber/contracts/hub-channels/src/query.rs
cw-cyber/packages/cyber-std/src/query.rs
cw-cyber/contracts/hub-tokens/src/query.rs
cw-cyber/contracts/hub-skills/src/query.rs
cw-cyber/contracts/hub-networks/src/query.rs
cw-cyber/contracts/cw-cyber-subgraph/src/query.rs
cw-cyber/contracts/graph-filter/src/query.rs
cw-cyber/contracts/hub-libs/src/query.rs
cw-cyber/contracts/cw-cyber-passport/src/query.rs
cw-cyber/contracts/hub-protocols/src/query.rs
cw-cyber/contracts/cw-cyber-gift/src/query.rs
cw-cyber/packages/cyber-std/src/tokenfactory/query.rs

Local Graph