summaryrefslogtreecommitdiff
path: root/src/transport/receiver.rs
blob: 6f00f87c4b17ff94c5c42c3df39a6057825632ca (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
use crate::{codec::Codec, context::Context, transport::Result};

pub trait PacketReceiver<Data, Uid: PartialEq>: Send + Sync {
    fn recv<P: Codec<Data>>(&self, ctx: &Context<Data>) -> Result<(Uid, P)>;
}

pub trait PacketReceiverBuf<Data, Uid: PartialEq>: Send + Sync {
    fn recv_buf(&self, ctx: &Context<Data>) -> Result<(Uid, Vec<u8>)>;
}

impl<Data, Uid: PartialEq, R: PacketReceiverBuf<Data, Uid>> PacketReceiver<Data, Uid> for R {
    fn recv<P: Codec<Data>>(&self, ctx: &Context<Data>) -> Result<(Uid, P)> {
        let (uid, bytes) = self.recv_buf(ctx)?;
        let mut reader = bytes.as_slice();
        let packet = P::decode(&mut reader, ctx)?;
        Ok((uid, packet))
    }
}