asimov_protocol/
message_send.rs1use crate::{MESSAGE_HEADER_LEN, Message, MessageLen, SendError};
4
5pub trait MessageSend {
6 fn send(&mut self, request: Message) -> impl Future<Output = Result<usize, SendError>> {
7 async move {
8 let mut buffer = [0u8; 64];
9 let (head_buffer, body_buffer) = buffer.split_at_mut(MESSAGE_HEADER_LEN);
10
11 let body: &mut [u8] = postcard::to_slice(&request, body_buffer)?;
12
13 let body_len = body.len() as MessageLen;
14 assert!(body_len <= MessageLen::MAX);
15 head_buffer.copy_from_slice(&body_len.to_be_bytes());
16
17 let write_len = MESSAGE_HEADER_LEN + body_len as usize;
18 self.write_all(&buffer[..write_len]).await?;
19
20 Ok(write_len)
21 }
22 }
23
24 fn write_all(&mut self, buffer: &[u8]) -> impl Future<Output = Result<(), SendError>>;
25}