Skip to main content

steel_utils/serial/
vec_as_map.rs

1//! Serde helpers that encode a `Vec<(K, V)>` as a map.
2
3use serde::de::{MapAccess, Visitor};
4use serde::ser::SerializeMap;
5use serde::{Deserialize, Deserializer, Serialize, Serializer};
6use std::fmt;
7use std::marker::PhantomData;
8
9/// Serializes items as map entries, preserving their order.
10pub 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
23/// Deserializes map entries into items, preserving their order.
24pub 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}