1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
extern crate serde; use std::borrow::ToOwned; use std::hash::Hash; use std::rc::Rc; use std::borrow::Borrow; use self::serde::{Serialize, Deserialize, Serializer, Deserializer}; use super::{Intern, AllowIntern}; impl<T> Serialize for Intern<T> where T: AllowIntern + ?Sized + Serialize { fn serialize<S: Serializer>(&self, ser: S) -> Result<S::Ok, S::Error> { (&**self).serialize(ser) } } impl<'de, T> Deserialize<'de> for Intern<T> where T: AllowIntern + ToOwned, for<'a> &'a T: Into<Rc<T>>, <T as ToOwned>::Owned: Deserialize<'de> + Into<Rc<T>> + Hash + Eq, { fn deserialize<D: Deserializer<'de>>(de: D) -> Result<Self, D::Error> { <T as ToOwned>::Owned::deserialize(de).map(|o| Self::new(o.borrow())) } }