essential_server_types/
ser.rs1use 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
117pub 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
136pub 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}