hpl_interface/
lib.rs

1use std::error::Error;
2
3use cosmwasm_schema::cw_serde;
4use cosmwasm_std::{to_json_binary, QueryResponse, StdError, StdResult};
5use cw_storage_plus::Bound;
6
7pub mod connection;
8pub mod core;
9pub mod hook;
10pub mod igp;
11pub mod ism;
12mod macros;
13pub mod ownable;
14pub mod pausable;
15pub mod router;
16pub mod types;
17pub mod warp;
18
19pub use macros::*;
20
21#[cw_serde]
22pub enum Order {
23    Asc,
24    Desc,
25}
26
27impl Default for Order {
28    fn default() -> Self {
29        Self::Asc
30    }
31}
32
33impl From<Order> for cosmwasm_std::Order {
34    fn from(v: Order) -> Self {
35        match v {
36            Order::Asc => cosmwasm_std::Order::Ascending,
37            Order::Desc => cosmwasm_std::Order::Descending,
38        }
39    }
40}
41
42// Settings for pagination
43pub const MAX_LIMIT: u32 = 30;
44pub const DEFAULT_LIMIT: u32 = 10;
45
46pub fn get_and_check_limit(limit: Option<u32>, max: u32, default: u32) -> StdResult<u32> {
47    match limit {
48        Some(l) => {
49            if l <= max {
50                Ok(l)
51            } else {
52                Err(StdError::generic_err(format!(
53                    "oversized request. size: {:?}, max: {:?}",
54                    l as u64, max as u64,
55                )))
56            }
57        }
58        None => Ok(default),
59    }
60}
61
62type RangeOptionRespBound<'a, T> = Option<Bound<'a, T>>;
63type RangeOptionResp<'a, T> = (
64    (RangeOptionRespBound<'a, T>, RangeOptionRespBound<'a, T>),
65    usize,
66    Order,
67);
68
69pub fn range_option<'a, T: cw_storage_plus::PrimaryKey<'a>>(
70    start: Option<T>,
71    limit: Option<u32>,
72    order: Option<Order>,
73) -> StdResult<RangeOptionResp<'a, T>> {
74    let limit = get_and_check_limit(limit, MAX_LIMIT, DEFAULT_LIMIT)? as usize;
75    let order = order.unwrap_or(Order::Asc);
76    let (min, max) = match order {
77        Order::Asc => (start.map(Bound::exclusive), None),
78        Order::Desc => (None, start.map(Bound::exclusive)),
79    };
80
81    Ok(((min, max), limit, order))
82}
83
84pub fn to_binary<T: serde::Serialize, E: Error, F: From<E> + From<StdError>>(
85    data: Result<T, E>,
86) -> Result<QueryResponse, F> {
87    data.map(|v| to_json_binary(&v))?.map_err(|err| err.into())
88}
89
90#[cfg(test)]
91pub use test::msg_checker;
92
93#[cfg(test)]
94mod test {
95    use cosmwasm_std::{from_json, to_json_binary};
96    use serde::{de::DeserializeOwned, Serialize};
97
98    pub fn msg_checker<Input: Serialize, Output: DeserializeOwned>(input: Input) -> Output {
99        from_json::<Output>(to_json_binary(&input).unwrap()).unwrap()
100    }
101}