Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Make the serde support behave better #141

Merged
merged 1 commit into from Jun 16, 2016
Merged
Changes from all commits
Commits
File filter...
Filter file types
Jump to…
Jump to file
Failed to load files.

Always

Just for now

Make the serde support behave better

The previous implementation could produce illegal JSON when used
with serde_json.

This is a breaking change because we have to add a Clone bound on
the Deserialize impls.
  • Loading branch information
nox committed Jun 14, 2016
commit c50aa4f3590871c51e7dfffa6e9a2cb2868cc04c
@@ -1,6 +1,6 @@
[package]
name = "euclid"
version = "0.6.8"
version = "0.7.0"
authors = ["The Servo Project Developers"]
description = "Geometry primitives"
documentation = "http://doc.servo.org/euclid/"
@@ -7,8 +7,38 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.

macro_rules! deserialize {
(
{ $field:ident, $($rest:tt)* }
$count:tt
{ $($acc:tt)* }
$name:ident
$deserializer:ident
$T:ty
) => (
deserialize!(
{ $($rest)* }
(1 + $count)
{ $($acc)* { $field $count } }
$name
$deserializer
$T)
);
(
{}
$total:tt
{ $({ $field:ident $index:expr })+ }
$name:ident
$deserializer:ident
$T:ty
) => ({
let values = try!(<[$T; $total]>::deserialize($deserializer));
Ok($name { $($field: values[$index].clone(),)+ })
})
}

macro_rules! define_matrix {
($(#[$attr:meta])* pub struct $name:ident <T> { $(pub $field:ident: T,)+ }) => (
($(#[$attr:meta])* pub struct $name:ident<T> { $(pub $field:ident: T,)+ }) => (
$(#[$attr])*
#[derive(Clone, Copy, Eq, Hash, PartialEq)]
pub struct $name<T> {
@@ -21,23 +51,19 @@ macro_rules! define_matrix {
}
}

impl<T: ::serde::Deserialize> ::serde::Deserialize for $name<T> {
impl<T: Clone + ::serde::Deserialize> ::serde::Deserialize for $name<T> {
fn deserialize<D>(deserializer: &mut D) -> Result<Self, D::Error>
where D: ::serde::Deserializer
{
$(let $field = try!(T::deserialize(deserializer));)+
Ok($name {
$($field: $field,)+
})
deserialize!({ $($field,)+ } 0 {} $name deserializer T)
}
}

impl<T: ::serde::Serialize> ::serde::Serialize for $name<T> {
fn serialize<S>(&self, serializer: &mut S) -> Result<(), S::Error>
where S: ::serde::Serializer
{
$(try!(self.$field.serialize(serializer));)+
Ok(())
[$(&self.$field,)+].serialize(serializer)
}
}
)
@@ -31,12 +31,11 @@ impl<T: HeapSizeOf> HeapSizeOf for Rect<T> {
}
}

impl<T: Deserialize> Deserialize for Rect<T> {
impl<T: Clone + Deserialize> Deserialize for Rect<T> {
fn deserialize<D>(deserializer: &mut D) -> Result<Self, D::Error>
where D: Deserializer
{
let origin = try!(Deserialize::deserialize(deserializer));
let size = try!(Deserialize::deserialize(deserializer));
let (origin, size) = try!(Deserialize::deserialize(deserializer));
Ok(Rect {
origin: origin,
size: size,
@@ -48,9 +47,7 @@ impl<T: Serialize> Serialize for Rect<T> {
fn serialize<S>(&self, serializer: &mut S) -> Result<(), S::Error>
where S: Serializer
{
try!(self.origin.serialize(serializer));
try!(self.size.serialize(serializer));
Ok(())
(&self.origin, &self.size).serialize(serializer)
}
}

@@ -10,6 +10,7 @@
//! A group of side offsets, which correspond to top/left/bottom/right for borders, padding,
//! and margins in CSS.

#[cfg(feature = "unstable")]
use heapsize::HeapSizeOf;
use num::Zero;
use std::ops::Add;
ProTip! Use n and p to navigate between commits in a pull request.
You can’t perform that action at this time.