1use karyon_net::{
2 codec::{Codec, LengthCodec},
3 ByteBuffer,
4};
5
6use crate::{
7 message::PeerNetMsg,
8 util::{decode, encode},
9};
10
11#[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}