/rust/registry/src/index.crates.io-1949cf8c6b5b557f/revision-0.10.0/src/implementations/option.rs
Line | Count | Source |
1 | | use super::super::Error; |
2 | | use super::super::Revisioned; |
3 | | |
4 | | impl<T> Revisioned for Option<T> |
5 | | where |
6 | | T: Revisioned, |
7 | | { |
8 | | #[inline] |
9 | 0 | fn serialize_revisioned<W: std::io::Write>(&self, writer: &mut W) -> Result<(), Error> { |
10 | 0 | match self { |
11 | 0 | Some(value) => { |
12 | 0 | 1u8.serialize_revisioned(writer)?; |
13 | 0 | value.serialize_revisioned(writer) |
14 | | } |
15 | 0 | None => 0u8.serialize_revisioned(writer), |
16 | | } |
17 | 0 | } |
18 | | |
19 | | #[inline] |
20 | 0 | fn deserialize_revisioned<R: std::io::Read>(reader: &mut R) -> Result<Self, Error> { |
21 | 0 | let option = u8::deserialize_revisioned(reader)?; |
22 | 0 | match option { |
23 | 0 | 0u8 => Ok(None), |
24 | 0 | 1u8 => Ok(Some(T::deserialize_revisioned(reader)?)), |
25 | 0 | value => Err(Error::Deserialize(format!("Invalid option value {}", value))), |
26 | | } |
27 | 0 | } |
28 | | |
29 | 0 | fn revision() -> u16 { |
30 | 0 | 1 |
31 | 0 | } |
32 | | } |
33 | | |
34 | | #[cfg(test)] |
35 | | mod tests { |
36 | | |
37 | | use super::Revisioned; |
38 | | |
39 | | #[test] |
40 | | fn test_option_none() { |
41 | | let val: Option<String> = None; |
42 | | let mut mem: Vec<u8> = vec![]; |
43 | | val.serialize_revisioned(&mut mem).unwrap(); |
44 | | assert_eq!(mem.len(), 1); |
45 | | let out = |
46 | | <Option<String> as Revisioned>::deserialize_revisioned(&mut mem.as_slice()).unwrap(); |
47 | | assert_eq!(val, out); |
48 | | } |
49 | | |
50 | | #[test] |
51 | | fn test_option_some() { |
52 | | let val: Option<String> = Some(String::from("this is a test")); |
53 | | let mut mem: Vec<u8> = vec![]; |
54 | | val.serialize_revisioned(&mut mem).unwrap(); |
55 | | assert_eq!(mem.len(), 16); |
56 | | let out = |
57 | | <Option<String> as Revisioned>::deserialize_revisioned(&mut mem.as_slice()).unwrap(); |
58 | | assert_eq!(val, out); |
59 | | } |
60 | | } |