Skip to main content

karyon_net/codec/
bytes_codec.rs

1use crate::{codec::Codec, ByteBuffer, Error, Result};
2
3const MAX_BUFFER_SIZE: usize = 4 * 1024 * 1024; // 4MB
4
5#[derive(Clone)]
6pub struct BytesCodec {
7    max_size: usize,
8}
9
10impl Default for BytesCodec {
11    fn default() -> Self {
12        Self {
13            max_size: MAX_BUFFER_SIZE,
14        }
15    }
16}
17
18impl BytesCodec {
19    pub fn new(max_size: usize) -> Self {
20        Self { max_size }
21    }
22}
23
24impl Codec<ByteBuffer> for BytesCodec {
25    type Message = Vec<u8>;
26    type Error = Error;
27
28    fn encode(&self, src: &Vec<u8>, dst: &mut ByteBuffer) -> Result<usize> {
29        if src.len() > self.max_size {
30            return Err(Error::BufferFull(format!(
31                "Buffer size {} exceeds maximum {}",
32                src.len(),
33                self.max_size
34            )));
35        }
36
37        dst.extend_from_slice(src);
38        Ok(src.len())
39    }
40
41    fn decode(&self, src: &mut ByteBuffer) -> Result<Option<(usize, Vec<u8>)>> {
42        if src.len() > self.max_size {
43            return Err(Error::BufferFull(format!(
44                "Buffer size {} exceeds maximum {}",
45                src.len(),
46                self.max_size
47            )));
48        }
49
50        if src.is_empty() {
51            Ok(None)
52        } else {
53            Ok(Some((src.len(), src.as_ref().to_vec())))
54        }
55    }
56}