Skip to main content

pamoja_codec/
bytes.rs

1//! A codec that carries raw bytes unchanged.
2
3use pamoja_core::Result;
4
5use crate::Codec;
6
7/// A no-op codec for payloads that are already byte buffers.
8///
9/// Encoding clones the buffer and decoding copies the input, so values pass
10/// through unchanged. This is the "raw framing" option for payloads that carry
11/// their own format, such as an image chunk or a pre-encoded frame.
12///
13/// # Examples
14///
15/// ```
16/// use pamoja_codec::{BytesCodec, Codec};
17///
18/// let codec = BytesCodec;
19/// let payload = vec![0xde, 0xad, 0xbe, 0xef];
20/// let encoded = codec.encode(&payload).unwrap();
21/// assert_eq!(codec.decode(&encoded).unwrap(), payload);
22/// ```
23#[derive(Clone, Copy, Debug, Default)]
24pub struct BytesCodec;
25
26impl Codec<Vec<u8>> for BytesCodec {
27    fn encode(&self, value: &Vec<u8>) -> Result<Vec<u8>> {
28        Ok(value.clone())
29    }
30
31    fn decode(&self, bytes: &[u8]) -> Result<Vec<u8>> {
32        Ok(bytes.to_vec())
33    }
34}
35
36#[cfg(test)]
37mod tests {
38    use super::*;
39
40    #[test]
41    fn round_trips_arbitrary_bytes() {
42        let codec = BytesCodec;
43        let payload = vec![1u8, 2, 3, 255, 0];
44        let encoded = codec.encode(&payload).expect("encode");
45        assert_eq!(encoded, payload);
46        assert_eq!(codec.decode(&encoded).expect("decode"), payload);
47    }
48
49    #[test]
50    fn round_trips_an_empty_buffer() {
51        let codec = BytesCodec;
52        let encoded = codec.encode(&Vec::new()).expect("encode");
53        assert!(encoded.is_empty());
54        assert!(codec.decode(&encoded).expect("decode").is_empty());
55    }
56}