karyon_net/codec/
bytes_codec.rs1use crate::{
2 codec::{ByteBuffer, Codec, Decoder, Encoder},
3 Error, Result,
4};
5
6const MAX_BUFFER_SIZE: usize = 4 * 1024 * 1024; #[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}