karyon_net/codec/
bytes_codec.rs

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