diff --git a/src/serde.rs b/src/serde.rs index 3dc32b6..b2f8a33 100644 --- a/src/serde.rs +++ b/src/serde.rs @@ -1,8 +1,8 @@ extern crate serde; -use self::serde::ser::{Serialize, Serializer, SerializeMap}; -use self::serde::de::{Deserialize, Deserializer, MapAccess, Visitor}; +use self::serde::ser::{Serialize, Serializer, SerializeMap, SerializeSeq}; +use self::serde::de::{Deserialize, Deserializer, MapAccess, SeqAccess, Visitor}; use std::fmt::{self, Formatter}; use std::hash::{BuildHasher, Hash}; @@ -65,3 +65,59 @@ impl<'de, K, V, S> Deserialize<'de> for OrderMap deserializer.deserialize_map(OrderMapVisitor(PhantomData)) } } + + +use OrderSet; + +/// Requires crate feature `"serde-1"` +impl Serialize for OrderSet + where T: Serialize + Hash + Eq, + S: BuildHasher +{ + fn serialize(&self, serializer: Se) -> Result + where Se: Serializer + { + let mut set_serializer = try!(serializer.serialize_seq(Some(self.len()))); + for value in self { + try!(set_serializer.serialize_element(value)); + } + set_serializer.end() + } +} + +struct OrderSetVisitor(PhantomData<(T, S)>); + +impl<'de, T, S> Visitor<'de> for OrderSetVisitor + where T: Deserialize<'de> + Eq + Hash, + S: Default + BuildHasher +{ + type Value = OrderSet; + + fn expecting(&self, formatter: &mut Formatter) -> fmt::Result { + write!(formatter, "a set") + } + + fn visit_seq(self, mut seq: A) -> Result + where A: SeqAccess<'de> + { + let mut values = OrderSet::with_capacity_and_hasher(seq.size_hint().unwrap_or(0), Default::default()); + + while let Some(value) = try!(seq.next_element()) { + values.insert(value); + } + + Ok(values) + } +} + +/// Requires crate feature `"serde-1"` +impl<'de, T, S> Deserialize<'de> for OrderSet + where T: Deserialize<'de> + Eq + Hash, + S: Default + BuildHasher +{ + fn deserialize(deserializer: D) -> Result + where D: Deserializer<'de> + { + deserializer.deserialize_seq(OrderSetVisitor(PhantomData)) + } +}