/rust/registry/src/index.crates.io-6f17d22bba15001f/radix_trie-0.2.1/src/serde.rs
Line | Count | Source (jump to first uncovered line) |
1 | | extern crate serde; |
2 | | |
3 | | use self::serde::ser::SerializeMap; |
4 | | use self::serde::{de, Deserialize, Deserializer, Serialize, Serializer}; |
5 | | use super::{Trie, TrieCommon, TrieKey}; |
6 | | use std::fmt::{self, Formatter}; |
7 | | use std::marker::PhantomData; |
8 | | |
9 | | impl<K, V> Serialize for Trie<K, V> |
10 | | where |
11 | | K: Serialize + TrieKey, |
12 | | V: Serialize, |
13 | | { |
14 | 0 | fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> |
15 | 0 | where |
16 | 0 | S: Serializer, |
17 | 0 | { |
18 | 0 | let mut map = serializer.serialize_map(Some(self.len()))?; |
19 | 0 | for (k, v) in self.iter() { |
20 | 0 | map.serialize_entry(k, v)?; |
21 | | } |
22 | 0 | map.end() |
23 | 0 | } Unexecuted instantiation: <radix_trie::Trie<alloc::vec::Vec<u8>, u64> as serde::ser::Serialize>::serialize::<&mut bincode::ser::Serializer<&mut alloc::vec::Vec<u8>, bincode::config::WithOtherIntEncoding<bincode::config::DefaultOptions, bincode::config::int::FixintEncoding>>> Unexecuted instantiation: <radix_trie::Trie<alloc::vec::Vec<u8>, u64> as serde::ser::Serialize>::serialize::<&mut bincode::ser::SizeChecker<&mut bincode::config::WithOtherIntEncoding<bincode::config::DefaultOptions, bincode::config::int::FixintEncoding>>> Unexecuted instantiation: <radix_trie::Trie<_, _> as serde::ser::Serialize>::serialize::<_> |
24 | | } |
25 | | |
26 | | struct TrieVisitor<K, V> { |
27 | | marker: PhantomData<Trie<K, V>>, |
28 | | } |
29 | | |
30 | | impl<K, V> TrieVisitor<K, V> { |
31 | 0 | fn new() -> Self { |
32 | 0 | TrieVisitor { |
33 | 0 | marker: PhantomData, |
34 | 0 | } |
35 | 0 | } Unexecuted instantiation: <radix_trie::serde::TrieVisitor<alloc::vec::Vec<u8>, u64>>::new Unexecuted instantiation: <radix_trie::serde::TrieVisitor<_, _>>::new |
36 | | } |
37 | | |
38 | | impl<'a, K, V> de::Visitor<'a> for TrieVisitor<K, V> |
39 | | where |
40 | | K: Deserialize<'a> + Clone + Eq + PartialEq + TrieKey, |
41 | | V: Deserialize<'a>, |
42 | | { |
43 | | type Value = Trie<K, V>; |
44 | | |
45 | 0 | fn expecting(&self, formatter: &mut Formatter) -> fmt::Result { |
46 | 0 | write!(formatter, "a serialized trie") |
47 | 0 | } |
48 | | |
49 | 0 | fn visit_map<M>(self, mut visitor: M) -> Result<Self::Value, M::Error> |
50 | 0 | where |
51 | 0 | M: de::MapAccess<'a>, |
52 | 0 | { |
53 | 0 | let mut values = Trie::new(); |
54 | | |
55 | 0 | while let Some((key, value)) = visitor.next_entry()? { |
56 | 0 | values.insert(key, value); |
57 | 0 | } |
58 | | |
59 | 0 | Ok(values) |
60 | 0 | } Unexecuted instantiation: <radix_trie::serde::TrieVisitor<alloc::vec::Vec<u8>, u64> as serde::de::Visitor>::visit_map::<<&mut bincode::de::Deserializer<_, _> as serde::de::Deserializer>::deserialize_map::Access<bincode::de::read::IoReader<&[u8]>, bincode::config::WithOtherTrailing<bincode::config::WithOtherIntEncoding<bincode::config::DefaultOptions, bincode::config::int::FixintEncoding>, bincode::config::trailing::AllowTrailing>>> Unexecuted instantiation: <radix_trie::serde::TrieVisitor<_, _> as serde::de::Visitor>::visit_map::<_> |
61 | | |
62 | 0 | fn visit_unit<E>(self) -> Result<Self::Value, E> |
63 | 0 | where |
64 | 0 | E: de::Error, |
65 | 0 | { |
66 | 0 | Ok(Trie::new()) |
67 | 0 | } |
68 | | } |
69 | | |
70 | | impl<'a, K, V> Deserialize<'a> for Trie<K, V> |
71 | | where |
72 | | K: Deserialize<'a> + Clone + Eq + PartialEq + TrieKey, |
73 | | V: Deserialize<'a>, |
74 | | { |
75 | 0 | fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> |
76 | 0 | where |
77 | 0 | D: Deserializer<'a>, |
78 | 0 | { |
79 | 0 | // Instantiate our Visitor and ask the Deserializer to drive |
80 | 0 | // it over the input data, resulting in an instance of MyMap. |
81 | 0 | deserializer.deserialize_map(TrieVisitor::new()) |
82 | 0 | } Unexecuted instantiation: <radix_trie::Trie<alloc::vec::Vec<u8>, u64> as serde::de::Deserialize>::deserialize::<&mut bincode::de::Deserializer<bincode::de::read::IoReader<&[u8]>, bincode::config::WithOtherTrailing<bincode::config::WithOtherIntEncoding<bincode::config::DefaultOptions, bincode::config::int::FixintEncoding>, bincode::config::trailing::AllowTrailing>>> Unexecuted instantiation: <radix_trie::Trie<_, _> as serde::de::Deserialize>::deserialize::<_> |
83 | | } |
84 | | |
85 | | #[cfg(test)] |
86 | | mod test { |
87 | | extern crate serde_test; |
88 | | use self::serde_test::Token; |
89 | | use super::super::Trie; |
90 | | |
91 | | macro_rules! tests_de { |
92 | | ($($name:ident => $value:expr => $tokens:expr,)+) => { |
93 | | $(#[test] |
94 | | fn $name() { |
95 | | // Test ser/de roundtripping |
96 | | serde_test::assert_de_tokens(&$value, $tokens); |
97 | | })+ |
98 | | } |
99 | | } |
100 | | |
101 | | macro_rules! tests_ser { |
102 | | ($($name:ident => $value:expr => $tokens:expr,)+) => { |
103 | | $(#[test] |
104 | | fn $name() { |
105 | | serde_test::assert_ser_tokens(&$value, $tokens); |
106 | | })+ |
107 | | } |
108 | | } |
109 | | |
110 | | macro_rules! trie { |
111 | | () => { |
112 | | Trie::new() |
113 | | }; |
114 | | ($($key:expr => $value:expr),+) => { |
115 | | { |
116 | | let mut map = Trie::new(); |
117 | | $(map.insert($key, $value);)+ |
118 | | map |
119 | | } |
120 | | } |
121 | | } |
122 | | |
123 | | tests_ser! { |
124 | | test_ser_empty_trie => Trie::<&str, isize>::new() => &[ |
125 | | Token::Map { len: Some(0) }, |
126 | | Token::MapEnd, |
127 | | ], |
128 | | test_ser_single_element_trie => trie!["1" => 2] => &[ |
129 | | Token::Map { len: Some(1) }, |
130 | | |
131 | | Token::Str("1"), |
132 | | Token::I32(2), |
133 | | Token::MapEnd, |
134 | | ], |
135 | | test_ser_multiple_element_trie => trie!["1" => 2, "3" => 4] => &[ |
136 | | Token::Map { len: Some(2) }, |
137 | | Token::Str("1"), |
138 | | Token::I32(2), |
139 | | |
140 | | Token::Str("3"), |
141 | | Token::I32(4), |
142 | | Token::MapEnd, |
143 | | ], |
144 | | test_ser_deep_trie => trie!["1" => trie![], "2" => trie!["3" => 4, "5" => 6]] => &[ |
145 | | Token::Map { len: Some(2) }, |
146 | | Token::Str("1"), |
147 | | Token::Map { len: Some(0) }, |
148 | | Token::MapEnd, |
149 | | |
150 | | Token::Str("2"), |
151 | | Token::Map { len: Some(2) }, |
152 | | Token::Str("3"), |
153 | | Token::I32(4), |
154 | | |
155 | | Token::Str("5"), |
156 | | Token::I32(6), |
157 | | Token::MapEnd, |
158 | | Token::MapEnd, |
159 | | ], |
160 | | } |
161 | | |
162 | | tests_de! { |
163 | | test_de_empty_trie1 => Trie::<String, isize>::new() => &[ |
164 | | Token::Unit, |
165 | | ], |
166 | | test_de_empty_trie2 => Trie::<String, isize>::new() => &[ |
167 | | Token::Map { len: Some(0) }, |
168 | | Token::MapEnd, |
169 | | ], |
170 | | test_de_single_element_trie => trie!["1".to_string() => 2] => &[ |
171 | | Token::Map { len: Some(1) }, |
172 | | Token::Str("1"), |
173 | | Token::I32(2), |
174 | | Token::MapEnd, |
175 | | ], |
176 | | test_de_multiple_element_trie => trie!["1".to_string() => 2, "3".to_string() => 4] => &[ |
177 | | Token::Map { len: Some(2) }, |
178 | | Token::Str("1"), |
179 | | Token::I32(2), |
180 | | |
181 | | Token::Str("3"), |
182 | | Token::I32(4), |
183 | | Token::MapEnd, |
184 | | ], |
185 | | test_de_deep_trie => trie!["1".to_string() => trie![], "2".to_string() => trie!["3".to_string() => 4, "5".to_string() => 6]] => &[ |
186 | | Token::Map { len: Some(2) }, |
187 | | Token::Str("1"), |
188 | | Token::Map { len: Some(0) }, |
189 | | Token::MapEnd, |
190 | | |
191 | | Token::Str("2"), |
192 | | Token::Map { len: Some(2) }, |
193 | | Token::Str("3"), |
194 | | Token::I32(4), |
195 | | |
196 | | Token::Str("5"), |
197 | | Token::I32(6), |
198 | | Token::MapEnd, |
199 | | Token::MapEnd, |
200 | | ], |
201 | | test_de_empty_trie3 => Trie::<String, isize>::new() => &[ |
202 | | Token::UnitStruct { name: "Anything" }, |
203 | | ], |
204 | | test_de_empty_trie4 => Trie::<String, isize>::new() => &[ |
205 | | Token::Struct { |
206 | | name: "Anything", |
207 | | len: 0, |
208 | | }, |
209 | | Token::StructEnd, |
210 | | ], |
211 | | } |
212 | | } |