rip_rs/
version.rs

1use crate::serializer::SerializeError::UnknownVersion;
2use crate::serializer::{Serializable, SerializeError};
3
4#[derive(PartialEq, Copy, Clone, Debug)]
5pub enum Version {
6    MustBeDiscarded, // RFC1058
7    Version1,        // RFC1058
8    Version2,        // RFC2453
9    Unknown,
10}
11
12impl Version {
13    pub fn from_u8(value: u8) -> Self {
14        match value {
15            0 => Version::MustBeDiscarded,
16            1 => Version::Version1,
17            2 => Version::Version2,
18            _ => Version::Unknown,
19        }
20    }
21
22    pub fn to_u8(&self) -> Option<u8> {
23        match self {
24            Version::MustBeDiscarded => Some(0),
25            Version::Version1 => Some(1),
26            Version::Version2 => Some(2),
27            Version::Unknown => None,
28        }
29    }
30}
31
32impl Serializable for Version {
33    fn to_bytes(&self) -> Result<Vec<u8>, SerializeError> {
34        match self.to_u8() {
35            Some(byte) => Ok(vec![byte]),
36            None => Err(UnknownVersion),
37        }
38    }
39}
40
41#[cfg(test)]
42mod tests {
43    use crate::serializer::Serializable;
44    use crate::serializer::SerializeError::UnknownVersion;
45    use crate::version;
46    use crate::version::Version::{MustBeDiscarded, Unknown, Version1, Version2};
47
48    #[test]
49    fn test_from_u8() {
50        assert_eq!(version::Version::from_u8(0), MustBeDiscarded);
51        assert_eq!(version::Version::from_u8(1), Version1);
52        assert_eq!(version::Version::from_u8(2), Version2);
53        assert_eq!(version::Version::from_u8(3), Unknown);
54    }
55
56    #[test]
57    fn test_to_bytes() {
58        assert_eq!(MustBeDiscarded.to_bytes().unwrap(), vec![0x00]);
59        assert_eq!(Version1.to_bytes().unwrap(), vec![0x01]);
60        assert_eq!(Version2.to_bytes().unwrap(), vec![0x02]);
61        assert_eq!(Unknown.to_bytes().unwrap_err(), UnknownVersion);
62    }
63}