rhaki_cw_plus/
utils.rs

1use {
2    cosmwasm_schema::cw_serde,
3    cosmwasm_std::{StdError, StdResult},
4    std::{collections::HashMap, fmt::Debug, hash::Hash},
5};
6
7/// Transform a `Vec<T>` into `HashMap<uszie, T>`, where `key` is the index of `T`
8pub fn vec_to_i_hashmap<T>(vec: Vec<T>) -> HashMap<usize, T> {
9    let mut map: HashMap<usize, T> = HashMap::new();
10
11    for (i, v) in vec.into_iter().enumerate() {
12        map.insert(i, v);
13    }
14
15    map
16}
17
18/// Transform a `Vec<(K, V)>` into `HashMap<K, V>`
19pub fn vec_tuple_to_hashmap<K: Eq + Hash + Debug + Clone, V>(
20    vec: Vec<(K, V)>,
21) -> StdResult<HashMap<K, V>> {
22    let mut map: HashMap<K, V> = HashMap::new();
23
24    for (k, v) in vec {
25        if map.insert(k.clone(), v).is_some() {
26            return Err(StdError::generic_err(format!("Key alredy inserted, {k:?}")));
27        };
28    }
29
30    Ok(map)
31}
32
33#[cw_serde]
34pub enum UpdateOption<T> {
35    ToNone,
36    Some(T),
37}
38
39impl<T: Clone> UpdateOption<T> {
40    pub fn into_option(&self) -> Option<T> {
41        match self {
42            UpdateOption::ToNone => None,
43            UpdateOption::Some(t) => Some(t.clone()),
44        }
45    }
46
47    pub fn unwrap(self) -> T {
48        match self {
49            UpdateOption::ToNone => panic!("Unwrap a None value"),
50            UpdateOption::Some(val) => val,
51        }
52    }
53}
54
55#[allow(clippy::from_over_into)]
56impl<T> Into<Option<T>> for UpdateOption<T> {
57    fn into(self) -> Option<T> {
58        match self {
59            UpdateOption::ToNone => None,
60            UpdateOption::Some(val) => Some(val),
61        }
62    }
63}