Switch serializing Result to using simple enums

This commit is contained in:
Erick Tryzelaar 2015-07-30 07:58:02 -07:00
parent 71cc95248c
commit 5dc245d2ce
4 changed files with 12 additions and 59 deletions

View File

@ -916,11 +916,11 @@ impl<T, E> Deserialize for Result<T, E> where T: Deserialize, E: Deserialize {
{
match try!(visitor.visit_variant()) {
Field::Ok => {
let (value,) = try!(visitor.visit_tuple(1, TupleVisitor1::new()));
let value = try!(visitor.visit_simple());
Ok(Ok(value))
}
Field::Err => {
let (value,) = try!(visitor.visit_tuple(1, TupleVisitor1::new()));
let value = try!(visitor.visit_simple());
Ok(Err(value))
}
}

View File

@ -632,47 +632,10 @@ impl<T, E> Serialize for Result<T, E> where T: Serialize, E: Serialize {
fn serialize<S>(&self, serializer: &mut S) -> Result<(), S::Error> where S: Serializer {
match *self {
Result::Ok(ref value) => {
struct Visitor<'a, T: 'a>(Option<&'a T>);
impl<'a, T> SeqVisitor for Visitor<'a, T> where T: Serialize + 'a {
#[inline]
fn visit<S>(&mut self, serializer: &mut S) -> Result<Option<()>, S::Error>
where S: Serializer
{
match self.0.take() {
Some(value) => Ok(Some(try!(serializer.visit_seq_elt(value)))),
None => Ok(None),
}
}
#[inline]
fn len(&self) -> Option<usize> {
Some(1)
}
}
serializer.visit_tuple_variant("Result", 0, "Ok", Visitor(Some(value)))
serializer.visit_enum_simple("Result", 0, "Ok", value)
}
Result::Err(ref value) => {
struct Visitor<'a, E: 'a>(Option<&'a E>);
impl<'a, E> SeqVisitor for Visitor<'a, E> where E: Serialize + 'a {
#[inline]
fn visit<S>(&mut self, serializer: &mut S) -> Result<Option<()>, S::Error>
where S: Serializer {
match self.0.take() {
Some(value) => Ok(Some(try!(serializer.visit_seq_elt(value)))),
None => Ok(None),
}
}
#[inline]
fn len(&self) -> Option<usize> {
Some(1)
}
}
serializer.visit_tuple_variant("Result", 1, "Err", Visitor(Some(value)))
serializer.visit_enum_simple("Result", 1, "Err", value)
}
}
}

View File

@ -539,23 +539,17 @@ declare_tests! {
Token::EnumStart("Result"),
Token::Str("Ok"),
Token::EnumSeq,
Token::SeqStart(1),
Token::SeqSep,
Token::I32(0),
Token::SeqEnd,
Token::EnumEnd,
Token::EnumSimple,
Token::I32(0),
Token::SeqEnd,
],
Err::<i32, i32>(1) => vec![
Token::EnumStart("Result"),
Token::Str("Err"),
Token::EnumSeq,
Token::SeqStart(1),
Token::SeqSep,
Token::I32(1),
Token::SeqEnd,
Token::EnumEnd,
Token::EnumSimple,
Token::I32(1),
Token::SeqEnd,
],
}
test_unit {

View File

@ -396,16 +396,12 @@ declare_tests! {
}
test_result {
Ok::<i32, i32>(0) => vec![
Token::EnumSeqStart("Result", "Ok", Some(1)),
Token::SeqSep,
Token::EnumSimple("Result", "Ok"),
Token::I32(0),
Token::SeqEnd,
],
Err::<i32, i32>(1) => vec![
Token::EnumSeqStart("Result", "Err", Some(1)),
Token::SeqSep,
Token::EnumSimple("Result", "Err"),
Token::I32(1),
Token::SeqEnd,
],
}
test_slice {