sp_im/
ser.rs

1// This Source Code Form is subject to the terms of the Mozilla Public
2// License, v. 2.0. If a copy of the MPL was not distributed with this
3// file, You can obtain one at http://mozilla.org/MPL/2.0/.
4
5use serde::{
6  de::{
7    Deserialize,
8    Deserializer,
9    MapAccess,
10    SeqAccess,
11    Visitor,
12  },
13  ser::{
14    Serialize,
15    SerializeMap,
16    SerializeSeq,
17    Serializer,
18  },
19};
20use core::{
21  marker::PhantomData,
22  ops::Deref,
23};
24
25use core::fmt;
26
27use crate::{
28  ordmap::OrdMap,
29  ordset::OrdSet,
30  vector::Vector,
31};
32
33struct SeqVisitor<'de, S, A>
34where
35  S: From<Vec<A>>,
36  A: Deserialize<'de>, {
37  phantom_s: PhantomData<S>,
38  phantom_a: PhantomData<A>,
39  phantom_lifetime: PhantomData<&'de ()>,
40}
41
42impl<'de, S, A> SeqVisitor<'de, S, A>
43where
44  S: From<Vec<A>>,
45  A: Deserialize<'de>,
46{
47  pub(crate) fn new() -> SeqVisitor<'de, S, A> {
48    SeqVisitor {
49      phantom_s: PhantomData,
50      phantom_a: PhantomData,
51      phantom_lifetime: PhantomData,
52    }
53  }
54}
55
56impl<'de, S, A> Visitor<'de> for SeqVisitor<'de, S, A>
57where
58  S: From<Vec<A>>,
59  A: Deserialize<'de>,
60{
61  type Value = S;
62
63  fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
64    formatter.write_str("a sequence")
65  }
66
67  fn visit_seq<Access>(
68    self,
69    mut access: Access,
70  ) -> Result<Self::Value, Access::Error>
71  where
72    Access: SeqAccess<'de>,
73  {
74    let mut v: Vec<A> = match access.size_hint() {
75      None => Vec::new(),
76      Some(l) => Vec::with_capacity(l),
77    };
78    while let Some(i) = access.next_element()? {
79      v.push(i)
80    }
81    Ok(From::from(v))
82  }
83}
84
85struct MapVisitor<'de, S, K, V>
86where
87  S: From<Vec<(K, V)>>,
88  K: Deserialize<'de>,
89  V: Deserialize<'de>, {
90  phantom_s: PhantomData<S>,
91  phantom_k: PhantomData<K>,
92  phantom_v: PhantomData<V>,
93  phantom_lifetime: PhantomData<&'de ()>,
94}
95
96impl<'de, S, K, V> MapVisitor<'de, S, K, V>
97where
98  S: From<Vec<(K, V)>>,
99  K: Deserialize<'de>,
100  V: Deserialize<'de>,
101{
102  pub(crate) fn new() -> MapVisitor<'de, S, K, V> {
103    MapVisitor {
104      phantom_s: PhantomData,
105      phantom_k: PhantomData,
106      phantom_v: PhantomData,
107      phantom_lifetime: PhantomData,
108    }
109  }
110}
111
112impl<'de, S, K, V> Visitor<'de> for MapVisitor<'de, S, K, V>
113where
114  S: From<Vec<(K, V)>>,
115  K: Deserialize<'de>,
116  V: Deserialize<'de>,
117{
118  type Value = S;
119
120  fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
121    formatter.write_str("a sequence")
122  }
123
124  fn visit_map<Access>(
125    self,
126    mut access: Access,
127  ) -> Result<Self::Value, Access::Error>
128  where
129    Access: MapAccess<'de>,
130  {
131    let mut v: Vec<(K, V)> = match access.size_hint() {
132      None => Vec::new(),
133      Some(l) => Vec::with_capacity(l),
134    };
135    while let Some(i) = access.next_entry()? {
136      v.push(i)
137    }
138    Ok(From::from(v))
139  }
140}
141
142// Set
143
144impl<'de, A: Deserialize<'de> + Ord + Clone> Deserialize<'de> for OrdSet<A> {
145  fn deserialize<D>(des: D) -> Result<Self, D::Error>
146  where D: Deserializer<'de> {
147    des.deserialize_seq(SeqVisitor::new())
148  }
149}
150
151impl<A: Ord + Clone + Serialize> Serialize for OrdSet<A> {
152  fn serialize<S>(&self, ser: S) -> Result<S::Ok, S::Error>
153  where S: Serializer {
154    let mut s = ser.serialize_seq(Some(self.len()))?;
155    for i in self.iter() {
156      s.serialize_element(i.deref())?;
157    }
158    s.end()
159  }
160}
161
162// Map
163
164impl<'de, K: Deserialize<'de> + Ord + Clone, V: Deserialize<'de> + Clone>
165  Deserialize<'de> for OrdMap<K, V>
166{
167  fn deserialize<D>(des: D) -> Result<Self, D::Error>
168  where D: Deserializer<'de> {
169    des.deserialize_map(MapVisitor::<'de, OrdMap<K, V>, K, V>::new())
170  }
171}
172
173impl<K: Serialize + Ord + Clone, V: Serialize + Clone> Serialize
174  for OrdMap<K, V>
175{
176  fn serialize<S>(&self, ser: S) -> Result<S::Ok, S::Error>
177  where S: Serializer {
178    let mut s = ser.serialize_map(Some(self.len()))?;
179    for (k, v) in self.iter() {
180      s.serialize_entry(k.deref(), v.deref())?;
181    }
182    s.end()
183  }
184}
185
186// HashMap
187
188// impl<'de, K, V, S> Deserialize<'de> for HashMap<K, V, S>
189// where
190//   K: Deserialize<'de> + Hash + Eq + Clone,
191//   V: Deserialize<'de> + Clone,
192//   S: BuildHasher + Default,
193// {
194//   fn deserialize<D>(des: D) -> Result<Self, D::Error>
195//   where D: Deserializer<'de> {
196//     des.deserialize_map(MapVisitor::<'de, HashMap<K, V, S>, K, V>::new())
197//   }
198// }
199
200// impl<K, V, S> Serialize for HashMap<K, V, S>
201// where
202//   K: Serialize + Hash + Eq + Clone,
203//   V: Serialize + Clone,
204//   S: BuildHasher + Default,
205// {
206//   fn serialize<Ser>(&self, ser: Ser) -> Result<Ser::Ok, Ser::Error>
207//   where Ser: Serializer {
208//     let mut s = ser.serialize_map(Some(self.len()))?;
209//     for (k, v) in self.iter() {
210//       s.serialize_entry(k.deref(), v.deref())?;
211//     }
212//     s.end()
213//   }
214// }
215
216// HashSet
217
218// impl<'de, A: Deserialize<'de> + Hash + Eq + Clone, S: BuildHasher + Default>
219//   Deserialize<'de> for HashSet<A, S>
220// {
221//   fn deserialize<D>(des: D) -> Result<Self, D::Error>
222//   where D: Deserializer<'de> {
223//     des.deserialize_seq(SeqVisitor::new())
224//   }
225// }
226
227// impl<A: Serialize + Hash + Eq + Clone, S: BuildHasher + Default> Serialize
228//   for HashSet<A, S>
229// {
230//   fn serialize<Ser>(&self, ser: Ser) -> Result<Ser::Ok, Ser::Error>
231//   where Ser: Serializer {
232//     let mut s = ser.serialize_seq(Some(self.len()))?;
233//     for i in self.iter() {
234//       s.serialize_element(i.deref())?;
235//     }
236//     s.end()
237//   }
238// }
239
240// Vector
241
242impl<'de, A: Clone + Deserialize<'de>> Deserialize<'de> for Vector<A> {
243  fn deserialize<D>(des: D) -> Result<Self, D::Error>
244  where D: Deserializer<'de> {
245    des.deserialize_seq(SeqVisitor::<'de, Vector<A>, A>::new())
246  }
247}
248
249impl<A: Clone + Serialize> Serialize for Vector<A> {
250  fn serialize<S>(&self, ser: S) -> Result<S::Ok, S::Error>
251  where S: Serializer {
252    let mut s = ser.serialize_seq(Some(self.len()))?;
253    for i in self.iter() {
254      s.serialize_element(i.deref())?;
255    }
256    s.end()
257  }
258}
259
260// Tests
261
262#[cfg(test)]
263mod test {
264  use super::*;
265  use serde_json::{
266    from_str,
267    to_string,
268  };
269
270  quickcheck! {
271    fn ser_ordset(v: OrdSet<i32>) -> bool {
272      v == from_str::<OrdSet<i32>>(&to_string(&v).unwrap()).unwrap()
273    }
274
275    fn ser_ordmap(v: OrdMap<i32, i32>) -> bool {
276      v == from_str::<OrdMap<i32, i32>>(&to_string(&v).unwrap()).unwrap()
277    }
278
279
280    fn ser_vector(v: Vector<i32>) -> bool {
281      v == from_str::<Vector<i32>>(&to_string(&v).unwrap()).unwrap()
282    }
283  }
284}