kafrust_protocol/
frame.rs1use crate::codec::{Decoder, Encoder};
2use crate::error::{Error, Result};
3
4pub fn encode_frame(payload: &[u8]) -> Result<Vec<u8>> {
5 let length = i32::try_from(payload.len()).map_err(|_| Error::LengthOverflow("frame"))?;
6 let mut encoder = Encoder::new();
7 encoder.write_i32(length);
8 let mut frame = encoder.into_bytes();
9 frame.extend_from_slice(payload);
10 Ok(frame)
11}
12
13pub fn decode_frame(input: &[u8]) -> Result<&[u8]> {
14 let mut decoder = Decoder::new(input);
15 let length = decoder.read_i32()?;
16 if length < 0 {
17 return Err(Error::NegativeLength {
18 kind: "frame",
19 length,
20 });
21 }
22 let length = usize::try_from(length).map_err(|_| Error::LengthOverflow("frame"))?;
23 decoder.read_exact(length)
24}
25
26#[cfg(test)]
27#[allow(clippy::unwrap_used)]
28mod tests {
29 use super::{decode_frame, encode_frame};
30
31 #[test]
32 fn encodes_and_decodes_frame() {
33 let frame = encode_frame(&[0xde, 0xad, 0xbe, 0xef]).unwrap();
34 assert_eq!(frame, [0, 0, 0, 4, 0xde, 0xad, 0xbe, 0xef]);
35 assert_eq!(decode_frame(&frame).unwrap(), &[0xde, 0xad, 0xbe, 0xef]);
36 }
37}