From 8ac65af81f5f9cf6c5e2c2306705b50eed77cfb5 Mon Sep 17 00:00:00 2001 From: Michael Woerister Date: Wed, 20 Dec 2017 16:37:29 +0100 Subject: Implement Encodable and Decodable for Result. --- src/libserialize/serialize.rs | 48 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) (limited to 'src/libserialize') diff --git a/src/libserialize/serialize.rs b/src/libserialize/serialize.rs index 6d67bbc06cc..854ca4eb3b0 100644 --- a/src/libserialize/serialize.rs +++ b/src/libserialize/serialize.rs @@ -618,6 +618,54 @@ impl Decodable for Option { } } +impl Encodable for Result { + fn encode(&self, s: &mut S) -> Result<(), S::Error> { + s.emit_enum("Result", |s| { + match *self { + Ok(ref v) => { + s.emit_enum_variant("Ok", 0, 1, |s| { + s.emit_enum_variant_arg(0, |s| { + v.encode(s) + }) + }) + } + Err(ref v) => { + s.emit_enum_variant("Err", 1, 1, |s| { + s.emit_enum_variant_arg(0, |s| { + v.encode(s) + }) + }) + } + } + }) + } +} + +impl Decodable for Result { + fn decode(d: &mut D) -> Result, D::Error> { + d.read_enum("Result", |d| { + d.read_enum_variant(&["Ok", "Err"], |d, disr| { + match disr { + 0 => { + Ok(Ok(d.read_enum_variant_arg(0, |d| { + T1::decode(d) + })?)) + } + 1 => { + Ok(Err(d.read_enum_variant_arg(0, |d| { + T2::decode(d) + })?)) + } + _ => { + panic!("Encountered invalid discriminant while \ + decoding `Result`."); + } + } + }) + }) + } +} + macro_rules! peel { ($name:ident, $($other:ident,)*) => (tuple! { $($other,)* }) } -- cgit 1.4.1-3-g733a5