1use std::io::{Read, Write};
2
3use crate::error::CodecError;
4use crate::protocol::{Request, Response};
5
6const MAX_FRAME_LEN: u32 = 1024 * 1024; pub 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}