]> git.lizzy.rs Git - rust.git/commitdiff
Implement Encodable and Decodable for Result.
authorMichael Woerister <michaelwoerister@posteo>
Wed, 20 Dec 2017 15:37:29 +0000 (16:37 +0100)
committerMichael Woerister <michaelwoerister@posteo>
Wed, 20 Dec 2017 15:37:29 +0000 (16:37 +0100)
src/libserialize/serialize.rs

index 6d67bbc06cc1b1a84bc8d3a0a478c1d5caacef1a..854ca4eb3b03b78d6afe64441ad8cf1b982bc593 100644 (file)
@@ -618,6 +618,54 @@ fn decode<D: Decoder>(d: &mut D) -> Result<Option<T>, D::Error> {
     }
 }
 
+impl<T1: Encodable, T2: Encodable> Encodable for Result<T1, T2> {
+    fn encode<S: Encoder>(&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<T1:Decodable, T2:Decodable> Decodable for Result<T1, T2> {
+    fn decode<D: Decoder>(d: &mut D) -> Result<Result<T1, T2>, 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,)* })
 }