Skip to main content

cosmwasm_common_library/
serializable_map.rs

1use alloc::collections::btree_map::Iter;
2use core::fmt::Formatter;
3use cosmwasm_schema::serde::de::{SeqAccess, Visitor};
4use cosmwasm_schema::serde::ser::SerializeSeq;
5use cosmwasm_schema::serde::{Deserialize, Deserializer, Serialize, Serializer};
6use schemars::JsonSchema;
7use std::collections::BTreeMap;
8use std::marker::PhantomData;
9
10#[derive(Clone, Debug, PartialEq, Default, JsonSchema)]
11pub struct SerializableMap<K, V>(BTreeMap<K, V>)
12where
13    K: Ord + Serialize,
14    V: Serialize;
15
16impl<K, V> SerializableMap<K, V>
17where
18    K: Ord + Serialize,
19    V: Serialize,
20{
21    pub fn new() -> SerializableMap<K, V> {
22        Self(BTreeMap::new())
23    }
24
25    pub fn from(items: Vec<(K, V)>) -> SerializableMap<K, V> {
26        let mut me = Self(BTreeMap::new());
27        for item in items {
28            me.set(item.0, item.1)
29        }
30        me
31    }
32
33    pub fn set(&mut self, key: K, value: V) {
34        self.0.insert(key, value);
35    }
36
37    pub fn delete(&mut self, key: &K) -> bool {
38        self.0.remove(key).is_some()
39    }
40
41    pub fn get(&self, key: &K) -> Option<&V> {
42        self.0.get(key)
43    }
44
45    pub fn get_mut(&mut self, key: &K) -> Option<&mut V> {
46        self.0.get_mut(key)
47    }
48
49    pub fn iter(&self) -> Iter<'_, K, V> {
50        self.0.iter()
51    }
52
53    pub fn is_empty(&self) -> bool {
54        self.0.is_empty()
55    }
56}
57
58impl<K, V> Serialize for SerializableMap<K, V>
59where
60    K: Ord + Serialize,
61    V: Serialize,
62{
63    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
64    where
65        S: Serializer,
66    {
67        let mut s = serializer.serialize_seq(Some(self.0.len()))?;
68        for (k, v) in self.0.iter() {
69            s.serialize_element(&(k, v))?;
70        }
71        s.end()
72    }
73}
74
75impl<'d, K, V> Deserialize<'d> for SerializableMap<K, V>
76where
77    K: Ord + Serialize + Deserialize<'d>,
78    V: Serialize + Deserialize<'d>,
79{
80    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
81    where
82        D: Deserializer<'d>,
83    {
84        deserializer.deserialize_seq(SerializableMapVisitor::new())
85    }
86}
87
88struct SerializableMapVisitor<K, V>
89where
90    K: Ord + Serialize,
91    V: Serialize,
92{
93    phantom_data: PhantomData<(K, V)>,
94}
95
96impl<K, V> SerializableMapVisitor<K, V>
97where
98    K: Ord + Serialize,
99    V: Serialize,
100{
101    pub fn new() -> SerializableMapVisitor<K, V> {
102        SerializableMapVisitor {
103            phantom_data: PhantomData,
104        }
105    }
106}
107
108impl<'de, K, V> Visitor<'de> for SerializableMapVisitor<K, V>
109where
110    K: Ord + Serialize + Deserialize<'de>,
111    V: Serialize + Deserialize<'de>,
112{
113    type Value = SerializableMap<K, V>;
114
115    fn expecting(&self, formatter: &mut Formatter) -> core::fmt::Result {
116        formatter.write_str("struct SerializableMap")
117    }
118
119    fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
120    where
121        A: SeqAccess<'de>,
122    {
123        let mut map: SerializableMap<K, V> = SerializableMap::new();
124        while let Some(element) = seq.next_element::<(K, V)>()? {
125            map.set(element.0, element.1);
126        }
127        Ok(map)
128    }
129}