steel_utils/serial/
vec_as_map.rs1use serde::de::{MapAccess, Visitor};
4use serde::ser::SerializeMap;
5use serde::{Deserialize, Deserializer, Serialize, Serializer};
6use std::fmt;
7use std::marker::PhantomData;
8
9pub fn serialize<S, K, V>(items: &[(K, V)], serializer: S) -> Result<S::Ok, S::Error>
11where
12 S: Serializer,
13 K: Serialize,
14 V: Serialize,
15{
16 let mut map = serializer.serialize_map(Some(items.len()))?;
17 for (k, v) in items {
18 map.serialize_entry(k, v)?;
19 }
20 map.end()
21}
22
23pub fn deserialize<'de, D, K, V>(deserializer: D) -> Result<Vec<(K, V)>, D::Error>
25where
26 D: Deserializer<'de>,
27 K: Deserialize<'de>,
28 V: Deserialize<'de>,
29{
30 struct VecVisitor<K, V>(PhantomData<(K, V)>);
31
32 impl<'de, K, V> Visitor<'de> for VecVisitor<K, V>
33 where
34 K: Deserialize<'de>,
35 V: Deserialize<'de>,
36 {
37 type Value = Vec<(K, V)>;
38
39 fn expecting(&self, f: &mut fmt::Formatter) -> fmt::Result {
40 f.write_str("a map")
41 }
42
43 fn visit_map<A>(self, mut access: A) -> Result<Self::Value, A::Error>
44 where
45 A: MapAccess<'de>,
46 {
47 let mut items = Vec::new();
48 while let Some((k, v)) = access.next_entry()? {
49 items.push((k, v));
50 }
51 Ok(items)
52 }
53 }
54
55 deserializer.deserialize_map(VecVisitor(PhantomData))
56}