karyon_p2p/
codec.rs

1use karyon_core::util::{decode, encode, encode_into_slice};
2
3use karyon_net::codec::{ByteBuffer, Codec, Decoder, Encoder, LengthCodec};
4
5use crate::{
6    message::{NetMsg, RefreshMsg},
7    Error, Result,
8};
9
10#[derive(Clone)]
11pub struct NetMsgCodec {
12    inner_codec: LengthCodec,
13}
14
15impl NetMsgCodec {
16    pub fn new() -> Self {
17        Self {
18            inner_codec: LengthCodec {},
19        }
20    }
21}
22
23impl Codec for NetMsgCodec {
24    type Message = NetMsg;
25    type Error = Error;
26}
27
28impl Encoder for NetMsgCodec {
29    type EnMessage = NetMsg;
30    type EnError = Error;
31    fn encode(&self, src: &Self::EnMessage, dst: &mut ByteBuffer) -> Result<usize> {
32        let src = encode(src)?;
33        Ok(self.inner_codec.encode(&src, dst)?)
34    }
35}
36
37impl Decoder for NetMsgCodec {
38    type DeMessage = NetMsg;
39    type DeError = Error;
40    fn decode(&self, src: &mut ByteBuffer) -> Result<Option<(usize, Self::DeMessage)>> {
41        match self.inner_codec.decode(src)? {
42            Some((n, s)) => {
43                let (m, _) = decode::<Self::DeMessage>(&s)?;
44                Ok(Some((n, m)))
45            }
46            None => Ok(None),
47        }
48    }
49}
50
51#[derive(Clone)]
52pub struct RefreshMsgCodec {}
53
54impl Codec for RefreshMsgCodec {
55    type Message = RefreshMsg;
56    type Error = Error;
57}
58
59impl Encoder for RefreshMsgCodec {
60    type EnMessage = RefreshMsg;
61    type EnError = Error;
62    fn encode(&self, src: &Self::EnMessage, dst: &mut ByteBuffer) -> Result<usize> {
63        let n = encode_into_slice(src, dst.as_mut())?;
64        Ok(n)
65    }
66}
67
68impl Decoder for RefreshMsgCodec {
69    type DeMessage = RefreshMsg;
70    type DeError = Error;
71    fn decode(&self, src: &mut ByteBuffer) -> Result<Option<(usize, Self::DeMessage)>> {
72        let (m, n) = decode::<Self::DeMessage>(src.as_ref())?;
73        Ok(Some((n, m)))
74    }
75}