Skip to main content

nimbi_protocol/messages/
mod.rs

1pub mod check_update;
2
3use check_update::{CheckUpdateRequest, CheckUpdateResponse};
4use microdot::{
5    helpers::{Header, HEADER_SIZE},
6    Deserialize, MicrodotError, Serialize,
7};
8
9#[cfg_attr(feature = "defmt", derive(defmt::Format))]
10#[derive(Debug)]
11pub enum Message<'a> {
12    CheckUpdateRequest(CheckUpdateRequest<'a>),
13    CheckUpdateResponse(CheckUpdateResponse),
14}
15
16impl Serialize for Message<'_> {
17    fn serialize(&self, buf: &mut [u8]) -> Result<usize, MicrodotError> {
18        use Message::*;
19
20        let (header_buf, payload_buf) = buf.split_at_mut(HEADER_SIZE);
21
22        let (id, msg) = match self {
23            CheckUpdateRequest(msg) => (1, msg as &dyn Serialize),
24            CheckUpdateResponse(msg) => (2, msg as &dyn Serialize),
25        };
26
27        let mut bytes_written = 0;
28
29        bytes_written += msg.serialize(payload_buf)?;
30
31        let header = Header {
32            id,
33            size: bytes_written,
34        };
35
36        bytes_written += header.serialize(header_buf)?;
37
38        Ok(bytes_written)
39    }
40}
41
42impl<'a> Deserialize<'a> for Message<'a> {
43    fn deserialize(buf: &'a [u8]) -> Result<Self, MicrodotError> {
44        let header = Header::deserialize(&buf[..HEADER_SIZE])?;
45
46        let buf = &buf[HEADER_SIZE..header.size + HEADER_SIZE];
47
48        Ok(match header.id {
49            1 => Message::CheckUpdateRequest(CheckUpdateRequest::deserialize(buf)?),
50            2 => Message::CheckUpdateResponse(CheckUpdateResponse::deserialize(buf)?),
51            _ => return Err(MicrodotError::invalid_payload()),
52        })
53    }
54}
55
56#[cfg(test)]
57mod tests {
58    use crate::types::{Id, Version};
59
60    use super::*;
61
62    #[test]
63    fn message_should_serialize() {
64        // let msg = Message::CheckUpdateResponse()
65    }
66
67    #[test]
68    fn message_should_deserialize() {
69        let buf = [
70            1, 0, 27, 1, 0, 6, 97, 49, 49, 49, 49, 49, 2, 0, 6, 97, 49, 49, 49, 49, 49, 3, 0, 6, 0,
71            1, 0, 1, 0, 1,
72        ];
73
74        match Message::deserialize(&buf) {
75            Ok(Message::CheckUpdateRequest(msg)) => {
76                assert_eq!(msg.program_id, Id::from_str_unchecked("a11111"));
77                assert_eq!(msg.release_channel_id, Id::from_str_unchecked("a11111"));
78                assert_eq!(msg.current_version, Version::new(1, 1, 1));
79            }
80            Err(err) => {
81                dbg!(err);
82
83                unreachable!();
84            }
85            _ => unreachable!(),
86        }
87    }
88}