|
| 1 | +//! An optional implementation of serialization/deserialization. Reference |
| 2 | +//! implementations used: |
| 3 | +//! |
| 4 | +//! - [Serialize][1]. |
| 5 | +//! - [Deserialize][2]. |
| 6 | +//! |
| 7 | +//! [1]: https://github.com/serde-rs/serde/blob/97856462467db2e90cf368e407c7ebcc726a01a9/serde/src/ser/impls.rs#L601-L611 |
| 8 | +//! [2]: https://github.com/serde-rs/serde/blob/97856462467db2e90cf368e407c7ebcc726a01a9/serde/src/de/impls.rs#L694-L746 |
| 9 | +
|
| 10 | +extern crate serde; |
| 11 | + |
| 12 | +use super::LinearMap; |
| 13 | + |
| 14 | +use self::serde::{Serialize, Serializer, Deserialize, Deserializer}; |
| 15 | +use self::serde::ser::impls::MapIteratorVisitor; |
| 16 | +use self::serde::de::{Visitor, MapVisitor, Error}; |
| 17 | + |
| 18 | +use std::marker::PhantomData; |
| 19 | + |
| 20 | +impl<K, V> Serialize for LinearMap<K, V> |
| 21 | + where K: Serialize + Ord, |
| 22 | + V: Serialize, |
| 23 | +{ |
| 24 | + #[inline] |
| 25 | + fn serialize<S>(&self, serializer: &mut S) -> Result<(), S::Error> |
| 26 | + where S: Serializer, |
| 27 | + { |
| 28 | + serializer.serialize_map(MapIteratorVisitor::new(self.iter(), Some(self.len()))) |
| 29 | + } |
| 30 | +} |
| 31 | + |
| 32 | +struct LinearMapVisitor<K, V> { |
| 33 | + marker: PhantomData<LinearMap<K, V>>, |
| 34 | +} |
| 35 | + |
| 36 | +impl<K, V> LinearMapVisitor<K, V> { |
| 37 | + fn new() -> Self { |
| 38 | + LinearMapVisitor { |
| 39 | + marker: PhantomData, |
| 40 | + } |
| 41 | + } |
| 42 | +} |
| 43 | + |
| 44 | +impl<K, V> Visitor for LinearMapVisitor<K, V> |
| 45 | + where K: Deserialize + Eq, |
| 46 | + V: Deserialize, |
| 47 | +{ |
| 48 | + type Value = LinearMap<K, V>; |
| 49 | + |
| 50 | + #[inline] |
| 51 | + fn visit_unit<E>(&mut self) -> Result<Self::Value, E> |
| 52 | + where E: Error, |
| 53 | + { |
| 54 | + Ok(LinearMap::new()) |
| 55 | + } |
| 56 | + |
| 57 | + #[inline] |
| 58 | + fn visit_map<Visitor>(&mut self, mut visitor: Visitor) -> Result<Self::Value, Visitor::Error> |
| 59 | + where Visitor: MapVisitor, |
| 60 | + { |
| 61 | + let mut values = LinearMap::with_capacity(visitor.size_hint().0); |
| 62 | + |
| 63 | + while let Some((key, value)) = try!(visitor.visit()) { |
| 64 | + values.insert(key, value); |
| 65 | + } |
| 66 | + |
| 67 | + try!(visitor.end()); |
| 68 | + |
| 69 | + Ok(values) |
| 70 | + } |
| 71 | +} |
| 72 | + |
| 73 | +impl<K, V> Deserialize for LinearMap<K, V> |
| 74 | + where K: Deserialize + Eq, |
| 75 | + V: Deserialize, |
| 76 | +{ |
| 77 | + fn deserialize<D>(deserializer: &mut D) -> Result<LinearMap<K, V>, D::Error> |
| 78 | + where D: Deserializer, |
| 79 | + { |
| 80 | + deserializer.deserialize_map(LinearMapVisitor::new()) |
| 81 | + } |
| 82 | +} |
0 commit comments