Skip to main content

kafrust_protocol/
frame.rs

1use 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}