Skip to main content

asimov_protocol/
message_recv.rs

1// This is free and unencumbered software released into the public domain.
2
3use crate::{Message, RecvError};
4use heapless::Vec;
5
6pub trait MessageRecv {
7    fn recv(&mut self) -> impl Future<Output = Result<Message, RecvError>> {
8        async {
9            type Len = u32;
10            const HEAD_LEN: usize = size_of::<Len>();
11
12            let mut head_buffer = [0u8; HEAD_LEN];
13            self.read_exact(&mut head_buffer).await?;
14
15            let body_len = u32::from_be_bytes(head_buffer) as usize;
16
17            let mut buffer: Vec<u8, 1024> = Vec::new();
18            assert!(body_len <= buffer.capacity());
19            buffer.resize(body_len, 0)?;
20
21            self.read_exact(buffer.as_mut_slice()).await?;
22
23            let response: Message = postcard::from_bytes(buffer.as_slice())?;
24
25            Ok(response)
26        }
27    }
28
29    fn read_exact(&mut self, buffer: &mut [u8]) -> impl Future<Output = Result<(), RecvError>>;
30}