revision/implementations/
result.rs1use crate::DeserializeRevisioned;
2use crate::SerializeRevisioned;
3
4use super::super::Error;
5use super::super::Revisioned;
6
7impl<E: SerializeRevisioned, T: SerializeRevisioned> SerializeRevisioned for Result<T, E> {
8 #[inline]
9 fn serialize_revisioned<W: std::io::Write>(&self, writer: &mut W) -> Result<(), Error> {
10 match self {
11 Ok(v) => {
12 0u32.serialize_revisioned(writer)?;
13 v.serialize_revisioned(writer)
14 }
15 Err(e) => {
16 1u32.serialize_revisioned(writer)?;
17 e.serialize_revisioned(writer)
18 }
19 }
20 }
21}
22
23impl<E: DeserializeRevisioned, T: DeserializeRevisioned> DeserializeRevisioned for Result<T, E> {
24 #[inline]
25 fn deserialize_revisioned<R: std::io::Read>(reader: &mut R) -> Result<Self, Error> {
26 let variant = u32::deserialize_revisioned(reader)?;
27 match variant {
28 0 => Ok(Ok(T::deserialize_revisioned(reader)
29 .map_err(|ref err| Error::Deserialize(format!("{:?}", err)))?)),
30 1 => Ok(Err(E::deserialize_revisioned(reader)
31 .map_err(|ref err| Error::Deserialize(format!("{:?}", err)))?)),
32 _ => Err(Error::Deserialize("Unknown variant index".to_string())),
33 }
34 }
35}
36
37impl<E: Revisioned, T: Revisioned> Revisioned for Result<T, E> {
38 #[inline]
39 fn revision() -> u16 {
40 1
41 }
42}
43
44#[cfg(test)]
45mod tests {
46
47 use super::*;
48
49 #[test]
50 fn test_result_ok() {
51 let val: Result<bool, String> = Ok(true);
52 let mut mem: Vec<u8> = vec![];
53 val.serialize_revisioned(&mut mem).unwrap();
54 #[cfg(not(feature = "fixed-width-encoding"))]
55 assert_eq!(mem.len(), 2);
56 #[cfg(feature = "fixed-width-encoding")]
57 assert_eq!(mem.len(), 5);
58 let out = <Result<bool, String> as DeserializeRevisioned>::deserialize_revisioned(
59 &mut mem.as_slice(),
60 )
61 .unwrap();
62 assert_eq!(val, out);
63 }
64
65 #[test]
66 fn test_result_err() {
67 let val: Result<bool, String> = Err("some error".into());
68 let mut mem: Vec<u8> = vec![];
69 val.serialize_revisioned(&mut mem).unwrap();
70 #[cfg(not(feature = "fixed-width-encoding"))]
71 assert_eq!(mem.len(), 12);
72 #[cfg(feature = "fixed-width-encoding")]
73 assert_eq!(mem.len(), 22);
74 let out = <Result<bool, String> as DeserializeRevisioned>::deserialize_revisioned(
75 &mut mem.as_slice(),
76 )
77 .unwrap();
78 assert_eq!(val, out);
79 }
80}