asimov_protocol/
message_recv.rs1use 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}