Skip to main content

asimov_protocol/
message_send.rs

1// This is free and unencumbered software released into the public domain.
2
3use 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}