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
42pub 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}