nimbi_protocol/messages/
mod.rs1pub 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 }
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}