Skip to main content

halley_ipc/
codec.rs

1use std::io::{Read, Write};
2
3use crate::error::CodecError;
4use crate::protocol::{Request, Response};
5
6const MAX_FRAME_LEN: u32 = 1024 * 1024; // 1 MiB
7
8pub fn encode_request(req: &Request) -> Result<Vec<u8>, CodecError> {
9    postcard::to_stdvec(req).map_err(CodecError::Encode)
10}
11
12pub fn decode_request(bytes: &[u8]) -> Result<Request, CodecError> {
13    postcard::from_bytes(bytes).map_err(CodecError::Decode)
14}
15
16pub fn encode_response(resp: &Response) -> Result<Vec<u8>, CodecError> {
17    postcard::to_stdvec(resp).map_err(CodecError::Encode)
18}
19
20pub fn decode_response(bytes: &[u8]) -> Result<Response, CodecError> {
21    postcard::from_bytes(bytes).map_err(CodecError::Decode)
22}
23
24pub fn write_frame<W: Write>(writer: &mut W, payload: &[u8]) -> Result<(), CodecError> {
25    let len = payload.len() as u32;
26    writer.write_all(&len.to_le_bytes())?;
27    writer.write_all(payload)?;
28    writer.flush()?;
29    Ok(())
30}
31
32pub fn read_frame<R: Read>(reader: &mut R) -> Result<Vec<u8>, CodecError> {
33    let mut len_buf = [0u8; 4];
34    reader.read_exact(&mut len_buf)?;
35
36    let len = u32::from_le_bytes(len_buf);
37    if len > MAX_FRAME_LEN {
38        return Err(CodecError::FrameTooLarge(len));
39    }
40
41    let mut payload = vec![0u8; len as usize];
42    reader.read_exact(&mut payload)?;
43    Ok(payload)
44}