From f50f4f77925f1792d8d94b3d49424febf6e74cd8 Mon Sep 17 00:00:00 2001 From: Patrick Walton Date: Fri, 10 Jul 2015 17:09:15 -0700 Subject: [PATCH] Make `Length` and `ScaleFactor` serializable with `serde`. Needed for more multiprocess Servo stuff. --- src/length.rs | 14 ++++++++++++++ src/scale_factor.rs | 14 ++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/src/length.rs b/src/length.rs index 7e39c77..15f98fe 100644 --- a/src/length.rs +++ b/src/length.rs @@ -12,6 +12,7 @@ use scale_factor::ScaleFactor; use num::Zero; use num_lib::NumCast; +use serde::{Deserialize, Deserializer, Serialize, Serializer}; use std::cmp::Ordering; use std::ops::{Add, Sub, Mul, Div, Neg}; use std::marker::PhantomData; @@ -30,6 +31,19 @@ use std::marker::PhantomData; #[derive(Copy, RustcDecodable, RustcEncodable, Debug)] pub struct Length(pub T, PhantomData); +impl Deserialize for Length where T: Deserialize { + fn deserialize(deserializer: &mut D) -> Result,D::Error> + where D: Deserializer { + Ok(Length(try!(Deserialize::deserialize(deserializer)), PhantomData)) + } +} + +impl Serialize for Length where T: Serialize { + fn serialize(&self, serializer: &mut S) -> Result<(),S::Error> where S: Serializer { + self.0.serialize(serializer) + } +} + impl Length { pub fn new(x: T) -> Length { Length(x, PhantomData) diff --git a/src/scale_factor.rs b/src/scale_factor.rs index 6948a90..9aceb7e 100644 --- a/src/scale_factor.rs +++ b/src/scale_factor.rs @@ -11,6 +11,7 @@ use num::One; use num_lib::NumCast; +use serde::{Deserialize, Deserializer, Serialize, Serializer}; use std::ops::{Add, Mul, Sub, Div}; use std::marker::PhantomData; @@ -36,6 +37,19 @@ use std::marker::PhantomData; #[derive(Copy, RustcDecodable, RustcEncodable, Debug)] pub struct ScaleFactor(pub T, PhantomData<(Src, Dst)>); +impl Deserialize for ScaleFactor where T: Deserialize { + fn deserialize(deserializer: &mut D) -> Result,D::Error> + where D: Deserializer { + Ok(ScaleFactor(try!(Deserialize::deserialize(deserializer)), PhantomData)) + } +} + +impl Serialize for ScaleFactor where T: Serialize { + fn serialize(&self, serializer: &mut S) -> Result<(),S::Error> where S: Serializer { + self.0.serialize(serializer) + } +} + impl ScaleFactor { pub fn new(x: T) -> ScaleFactor { ScaleFactor(x, PhantomData)