simplify serializing tuples/structs/enums

This commit is contained in:
Erick Tryzelaar
2014-06-23 21:14:23 -04:00
parent 9058341234
commit 3f66b05798
3 changed files with 94 additions and 132 deletions
+26 -27
View File
@@ -76,15 +76,15 @@ pub trait Serializer<E> {
fn serialize_str(&mut self, v: &str) -> Result<(), E>;
fn serialize_tuple_start(&mut self, len: uint) -> Result<(), E>;
fn serialize_tuple_sep(&mut self) -> Result<(), E>;
fn serialize_tuple_sep<T: Serializable>(&mut self, v: &T) -> Result<(), E>;
fn serialize_tuple_end(&mut self) -> Result<(), E>;
fn serialize_struct_start(&mut self, name: &str, len: uint) -> Result<(), E>;
fn serialize_struct_sep(&mut self, name: &str) -> Result<(), E>;
fn serialize_struct_sep<T: Serializable>(&mut self, name: &str, v: &T) -> Result<(), E>;
fn serialize_struct_end(&mut self) -> Result<(), E>;
fn serialize_enum_start(&mut self, name: &str, variant: &str, len: uint) -> Result<(), E>;
fn serialize_enum_sep(&mut self) -> Result<(), E>;
fn serialize_enum_sep<T: Serializable>(&mut self, v: &T) -> Result<(), E>;
fn serialize_enum_end(&mut self) -> Result<(), E>;
fn serialize_option<T: Serializable>(&mut self, v: &Option<T>) -> Result<(), E>;
@@ -248,8 +248,7 @@ macro_rules! impl_serialize_tuple {
try!(s.serialize_tuple_start(len));
$(
try!(s.serialize_tuple_sep());
try!($name.serialize(s));
try!(s.serialize_tuple_sep($name));
)*
s.serialize_tuple_end()
}
@@ -287,14 +286,9 @@ mod tests {
>(&self, s: &mut S) -> Result<(), E> {
try!(s.serialize_struct_start("Inner", 3));
try!(s.serialize_struct_sep("a"));
try!(self.a.serialize(s));
try!(s.serialize_struct_sep("b"));
try!(self.b.serialize(s));
try!(s.serialize_struct_sep("c"));
try!(self.c.serialize(s));
try!(s.serialize_struct_sep("a", &self.a));
try!(s.serialize_struct_sep("b", &self.b));
try!(s.serialize_struct_sep("c", &self.c));
s.serialize_struct_end()
}
@@ -315,8 +309,7 @@ mod tests {
>(&self, s: &mut S) -> Result<(), E> {
try!(s.serialize_struct_start("Outer", 1));
try!(s.serialize_struct_sep("inner"));
try!(self.inner.serialize(s));
try!(s.serialize_struct_sep("inner", &self.inner));
s.serialize_struct_end()
}
@@ -340,14 +333,11 @@ mod tests {
Dog => {
try!(s.serialize_enum_start("Animal", "Dog", 0));
}
Frog(ref x, y) => {
Frog(ref x0, ref x1) => {
try!(s.serialize_enum_start("Animal", "Frog", 2));
try!(s.serialize_enum_sep());
try!(x.serialize(s));
try!(s.serialize_enum_sep());
try!(y.serialize(s));
try!(s.serialize_enum_sep(x0));
try!(s.serialize_enum_sep(x1));
}
}
s.serialize_enum_end()
@@ -494,8 +484,11 @@ mod tests {
self.serialize(TupleStart(len))
}
fn serialize_tuple_sep(&mut self) -> Result<(), Error> {
self.serialize(TupleSep)
fn serialize_tuple_sep<
T: Serializable
>(&mut self, value: &T) -> Result<(), Error> {
try!(self.serialize(TupleSep));
value.serialize(self)
}
fn serialize_tuple_end(&mut self) -> Result<(), Error> {
@@ -506,8 +499,11 @@ mod tests {
self.serialize(StructStart(name, len))
}
fn serialize_struct_sep(&mut self, name: &str) -> Result<(), Error> {
self.serialize(StructSep(name))
fn serialize_struct_sep<
T: Serializable
>(&mut self, name: &str, value: &T) -> Result<(), Error> {
try!(self.serialize(StructSep(name)));
value.serialize(self)
}
fn serialize_struct_end(&mut self) -> Result<(), Error> {
@@ -518,8 +514,11 @@ mod tests {
self.serialize(EnumStart(name, variant, len))
}
fn serialize_enum_sep(&mut self) -> Result<(), Error> {
self.serialize(EnumSep)
fn serialize_enum_sep<
T: Serializable
>(&mut self, value: &T) -> Result<(), Error> {
try!(self.serialize(EnumSep));
value.serialize(self)
}
fn serialize_enum_end(&mut self) -> Result<(), Error> {