1use serde::de::{MapAccess, Visitor};
2use serde::ser::SerializeMap;
3use serde::{Deserialize, Deserializer, Serialize, Serializer};
4use std::borrow::Borrow;
5use std::fmt;
6use std::fmt::{Debug, Formatter};
7use std::iter::FromIterator;
8use std::marker::PhantomData;
9
10#[derive(Clone, Eq, Hash, PartialOrd, PartialEq)]
11pub struct FakeMap<K, V> {
12 items: Vec<(K, V)>,
13}
14
15impl<K, V> Default for FakeMap<K, V> {
16 fn default() -> Self {
17 FakeMap::new()
18 }
19}
20
21impl<K, V> FakeMap<K, V> {
22 pub fn new() -> Self {
23 FakeMap { items: Vec::new() }
24 }
25
26 pub fn with_capacity(cap: usize) -> Self {
27 FakeMap {
28 items: Vec::with_capacity(cap),
29 }
30 }
31
32 #[inline]
33 pub fn insert(&mut self, k: K, v: V)
34 where
35 K: Eq,
36 {
37 match self.get_idx_of_key(&k) {
38 None => {
39 self.items.push((k, v));
40 }
41 Some(x) => {
42 self.items[x].1 = v;
43 }
44 }
45 }
46
47 fn get_idx_of_key<Q: ?Sized>(&self, key: &Q) -> Option<usize>
48 where
49 Q: PartialEq,
50 K: Borrow<Q>,
51 {
52 self.items.iter().position(|item| item.0.borrow() == key)
53 }
54
55 #[inline]
56 pub fn get<Q: ?Sized>(&self, key: &Q) -> Option<&V>
57 where
58 Q: PartialEq,
59 K: Borrow<Q>,
60 {
61 self.get_idx_of_key(key).map(|idx| &self.items[idx].1)
62 }
63
64 #[inline]
65 pub fn remove<Q: ?Sized>(&mut self, key: &Q) -> Option<V>
66 where
67 Q: PartialEq,
68 K: Borrow<Q>,
69 {
70 self.get_idx_of_key(key).map(|idx| self.items.remove(idx).1)
71 }
72
73 pub fn iter(&self) -> impl Iterator<Item = &(K, V)> {
74 self.items.iter()
75 }
76
77 pub fn iter_mut(&mut self) -> impl Iterator<Item = (&mut K, &mut V)> {
78 self.items.iter_mut().map(|kv| (&mut kv.0, &mut kv.1))
79 }
80
81 pub fn keys(&self) -> impl Iterator<Item = &K> {
82 self.items.iter().map(|kv| &kv.0)
83 }
84
85 pub fn keys_mut(&self) -> impl Iterator<Item = &K> {
86 self.items.iter().map(|kv| &kv.0)
87 }
88
89 pub fn values(&self) -> impl Iterator<Item = &V> {
90 self.items.iter().map(|kv| &kv.1)
91 }
92
93 pub fn values_mut(&mut self) -> impl Iterator<Item = &mut V> {
94 self.items.iter_mut().map(|kv| &mut kv.1)
95 }
96}
97
98impl<K, V> Debug for FakeMap<K, V>
99where
100 K: Debug,
101 V: Debug,
102{
103 fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
104 write!(f, "{{")?;
105 for (i, (key, value)) in self.iter().enumerate() {
106 if i > 0 {
107 write!(f, ", ")?;
108 }
109 write!(f, "{:?}: {:?}", key, value)?;
110 }
111 write!(f, "}}")?;
112
113 Ok(())
114 }
115}
116
117impl<K, V> IntoIterator for FakeMap<K, V> {
118 type Item = (K, V);
119 type IntoIter = std::vec::IntoIter<(K, V)>;
120
121 fn into_iter(self) -> Self::IntoIter {
122 self.items.into_iter()
123 }
124}
125
126impl<K, V> FromIterator<(K, V)> for FakeMap<K, V> {
127 fn from_iter<T: IntoIterator<Item = (K, V)>>(iter: T) -> Self {
128 FakeMap {
129 items: iter.into_iter().collect(),
130 }
131 }
132}
133
134struct FakeMapVisitor<K, V> {
143 marker: PhantomData<fn() -> FakeMap<K, V>>,
144}
145
146impl<K, V> FakeMapVisitor<K, V> {
147 fn new() -> Self {
148 FakeMapVisitor {
149 marker: PhantomData,
150 }
151 }
152}
153
154impl<'de, K, V> Visitor<'de> for FakeMapVisitor<K, V>
161where
162 K: Deserialize<'de> + Eq,
163 V: Deserialize<'de>,
164{
165 type Value = FakeMap<K, V>;
167
168 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
170 formatter.write_str("a map")
171 }
172
173 fn visit_map<M>(self, mut access: M) -> Result<Self::Value, M::Error>
177 where
178 M: MapAccess<'de>,
179 {
180 let mut map = FakeMap::with_capacity(access.size_hint().unwrap_or(0));
181
182 while let Some((key, value)) = access.next_entry()? {
185 map.insert(key, value);
186 }
187
188 Ok(map)
189 }
190}
191
192impl<'de, K, V> Deserialize<'de> for FakeMap<K, V>
193where
194 K: Deserialize<'de> + Eq,
195 V: Deserialize<'de>,
196{
197 fn deserialize<D>(deserializer: D) -> Result<Self, <D as Deserializer<'de>>::Error>
198 where
199 D: Deserializer<'de>,
200 {
201 deserializer.deserialize_map(FakeMapVisitor::new())
202 }
203}
204
205impl<K, V> Serialize for FakeMap<K, V>
206where
207 K: Serialize,
208 V: Serialize,
209{
210 fn serialize<S>(&self, serializer: S) -> Result<<S as Serializer>::Ok, <S as Serializer>::Error>
211 where
212 S: Serializer,
213 {
214 let mut serializer = serializer.serialize_map(Some(self.items.len()))?;
215
216 for (key, value) in self.iter() {
217 serializer.serialize_entry(key, value)?;
218 }
219
220 serializer.end()
221 }
222}