cosmwasm_common_library/
serializable_map.rs1use 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}