ethrex_p2p/discv4/
codec.rs1use crate::discv4::messages::{Message, Packet, PacketDecodeErr};
2
3use bytes::BytesMut;
4use secp256k1::SecretKey;
5use tokio_util::codec::{Decoder, Encoder};
6
7#[derive(Debug)]
8pub struct Discv4Codec {
9 signer: SecretKey,
10}
11
12impl Discv4Codec {
13 pub fn new(signer: SecretKey) -> Self {
14 Self { signer }
15 }
16}
17
18impl Decoder for Discv4Codec {
19 type Item = Packet;
20 type Error = PacketDecodeErr;
21
22 fn decode(&mut self, buf: &mut BytesMut) -> Result<Option<Self::Item>, Self::Error> {
23 if !buf.is_empty() {
24 Ok(Some(Packet::decode(&buf.split_to(buf.len()))?))
25 } else {
26 Ok(None)
27 }
28 }
29}
30
31impl Encoder<Message> for Discv4Codec {
32 type Error = PacketDecodeErr;
33
34 fn encode(&mut self, message: Message, buf: &mut BytesMut) -> Result<(), Self::Error> {
35 message.encode_with_header(buf, &self.signer);
36 Ok(())
37 }
38}