Skip to main content

nimbi_protocol/types/
version.rs

1use microdot::{deserialize::Deserialize, serialize::Serialize, MicrodotError};
2
3#[cfg_attr(feature = "defmt", derive(defmt::Format))]
4#[derive(Debug, PartialEq, Eq)]
5pub struct Version {
6    pub major: u16,
7    pub minor: u16,
8    pub patch: u16,
9}
10
11impl Version {
12    pub fn new(major: u16, minor: u16, patch: u16) -> Self {
13        Self {
14            major,
15            minor,
16            patch,
17        }
18    }
19}
20
21impl Serialize for Version {
22    fn serialize(&self, buf: &mut [u8]) -> Result<usize, MicrodotError> {
23        if buf.len() < 6 {
24            return Err(MicrodotError::invalid_length());
25        }
26
27        let mut bytes_written = 0;
28
29        bytes_written += self.major.serialize(&mut buf[bytes_written..])?;
30        bytes_written += self.minor.serialize(&mut buf[bytes_written..])?;
31        bytes_written += self.patch.serialize(&mut buf[bytes_written..])?;
32
33        Ok(bytes_written)
34    }
35}
36
37impl<'a> Deserialize<'a> for Version {
38    fn deserialize(buf: &'a [u8]) -> Result<Self, MicrodotError> {
39        if buf.len() < 6 {
40            return Err(MicrodotError::invalid_length());
41        }
42
43        let major = u16::deserialize(&buf[..2])?;
44        let minor = u16::deserialize(&buf[2..4])?;
45        let patch = u16::deserialize(&buf[4..])?;
46
47        Ok(Self::new(major, minor, patch))
48    }
49}
50
51#[cfg(test)]
52mod tests {
53    use super::*;
54
55    #[test]
56    fn version_should_serialize() {
57        let version = Version::new(1, 2, 3);
58
59        let mut buf = [0u8; 6];
60
61        match version.serialize(&mut buf) {
62            Ok(bytes_written) => {
63                assert_eq!(bytes_written, 6);
64                assert_eq!(&buf[..], &[0, 1, 0, 2, 0, 3]);
65            }
66            Err(err) => {
67                dbg!(err);
68
69                unreachable!();
70            }
71        }
72    }
73
74    #[test]
75    fn version_should_deserialize() {
76        let buf = &[0, 1, 0, 2, 0, 3];
77
78        match Version::deserialize(buf) {
79            Ok(version) => {
80                assert_eq!(version, Version::new(1, 2, 3));
81            }
82            Err(err) => {
83                dbg!(err);
84
85                unreachable!();
86            }
87        }
88    }
89}