Skip to main content

karyon_p2p/
codec.rs

1use karyon_net::{
2    codec::{Codec, LengthCodec},
3    ByteBuffer,
4};
5
6use crate::{
7    message::PeerNetMsg,
8    util::{decode, encode},
9};
10
11/// Length-prefixed bincode codec for the peer data-plane wire.
12#[derive(Clone)]
13pub struct PeerNetMsgCodec {
14    inner_codec: LengthCodec,
15}
16
17impl PeerNetMsgCodec {
18    pub fn new() -> Self {
19        Self {
20            inner_codec: LengthCodec::default(),
21        }
22    }
23}
24
25impl Default for PeerNetMsgCodec {
26    fn default() -> Self {
27        Self::new()
28    }
29}
30
31impl Codec<ByteBuffer> for PeerNetMsgCodec {
32    type Message = PeerNetMsg;
33    type Error = karyon_net::Error;
34
35    fn encode(
36        &self,
37        src: &PeerNetMsg,
38        dst: &mut ByteBuffer,
39    ) -> std::result::Result<usize, karyon_net::Error> {
40        let src = encode(src).map_err(|e| karyon_net::Error::IO(std::io::Error::other(e)))?;
41        self.inner_codec.encode(&src, dst)
42    }
43
44    fn decode(
45        &self,
46        src: &mut ByteBuffer,
47    ) -> std::result::Result<Option<(usize, PeerNetMsg)>, karyon_net::Error> {
48        match self.inner_codec.decode(src)? {
49            Some((n, s)) => {
50                let (m, _) = decode::<PeerNetMsg>(&s)
51                    .map_err(|e| karyon_net::Error::IO(std::io::Error::other(e)))?;
52                Ok(Some((n, m)))
53            }
54            None => Ok(None),
55        }
56    }
57}