essential_server_types/
ser.rs

1//! Utilities for helping with serialization and deserialization of essential types.
2
3use std::collections::BTreeMap;
4
5use essential_types::{
6    convert::{bytes_from_word, word_from_bytes},
7    ContentAddress, Key, Value, Word,
8};
9use serde::{de::Visitor, ser::SerializeMap, Deserialize, Deserializer, Serialize, Serializer};
10
11#[cfg(test)]
12mod tests;
13
14struct Ser<'a>(&'a [Word]);
15struct Deser(Vec<Word>);
16struct MapSer<'a>(&'a BTreeMap<Key, Value>);
17struct MapDeser(BTreeMap<Key, Value>);
18
19struct MapVis;
20struct OuterMapVis;
21
22impl<'a> Serialize for Ser<'a> {
23    fn serialize<S>(&self, s: S) -> Result<S::Ok, S::Error>
24    where
25        S: Serializer,
26    {
27        let bytes = self
28            .0
29            .iter()
30            .copied()
31            .flat_map(bytes_from_word)
32            .collect::<Vec<_>>();
33        essential_types::serde::bytecode::serialize(&bytes, s)
34    }
35}
36
37impl<'de> Deserialize<'de> for Deser {
38    fn deserialize<D>(d: D) -> Result<Self, D::Error>
39    where
40        D: Deserializer<'de>,
41    {
42        Ok(Self(
43            essential_types::serde::bytecode::deserialize(d)?
44                .chunks_exact(8)
45                .map(|chunk| word_from_bytes(chunk.try_into().expect("Always 8 bytes")))
46                .collect(),
47        ))
48    }
49}
50
51impl<'a> Serialize for MapSer<'a> {
52    fn serialize<S>(&self, s: S) -> Result<S::Ok, S::Error>
53    where
54        S: Serializer,
55    {
56        let mut m = s.serialize_map(Some(self.0.len()))?;
57        for (k, v) in self.0 {
58            m.serialize_entry(&Ser(k), &Ser(v))?;
59        }
60        m.end()
61    }
62}
63
64impl<'de> Deserialize<'de> for MapDeser {
65    fn deserialize<D>(d: D) -> Result<Self, D::Error>
66    where
67        D: Deserializer<'de>,
68    {
69        Ok(MapDeser(d.deserialize_map(MapVis)?))
70    }
71}
72
73impl<'de> Visitor<'de> for MapVis {
74    type Value = BTreeMap<Key, Value>;
75
76    fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result {
77        formatter.write_str("a map with bytecode keys and values")
78    }
79
80    fn visit_map<A>(self, mut map: A) -> Result<Self::Value, A::Error>
81    where
82        A: serde::de::MapAccess<'de>,
83    {
84        let mut m = BTreeMap::new();
85
86        while let Some((k, v)) = map.next_entry::<Deser, Deser>()? {
87            m.insert(k.0, v.0);
88        }
89
90        Ok(m)
91    }
92}
93
94impl<'de> Visitor<'de> for OuterMapVis {
95    type Value = BTreeMap<ContentAddress, BTreeMap<Key, Value>>;
96
97    fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result {
98        formatter.write_str(
99            "a map with content address keys and a map with bytecode keys and values as values",
100        )
101    }
102
103    fn visit_map<A>(self, mut map: A) -> Result<Self::Value, A::Error>
104    where
105        A: serde::de::MapAccess<'de>,
106    {
107        let mut m = BTreeMap::new();
108
109        while let Some((k, v)) = map.next_entry::<ContentAddress, MapDeser>()? {
110            m.insert(k, v.0);
111        }
112
113        Ok(m)
114    }
115}
116
117/// Serialize a BTreeMap of content addresses as keys and BTreeMaps of bytecode keys and values as values.
118pub fn serialize_map<S>(
119    map: &BTreeMap<ContentAddress, BTreeMap<Key, Value>>,
120    s: S,
121) -> Result<S::Ok, S::Error>
122where
123    S: Serializer,
124{
125    if s.is_human_readable() {
126        let mut m = s.serialize_map(Some(map.len()))?;
127        for (ca, kvs) in map {
128            m.serialize_entry(&ca, &MapSer(kvs))?;
129        }
130        m.end()
131    } else {
132        map.serialize(s)
133    }
134}
135
136/// Deserialize a BTreeMap of content addresses as keys and BTreeMaps of bytecode keys and values as values.
137pub fn deserialize_map<'de, D>(
138    d: D,
139) -> Result<BTreeMap<ContentAddress, BTreeMap<Key, Value>>, D::Error>
140where
141    D: Deserializer<'de>,
142{
143    d.deserialize_map(OuterMapVis)
144}