nimbi_protocol/types/
version.rs1use 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}