2 use async_trait::async_trait;
4 pub use mt_rudp::{Ack, Error as RudpError};
5 use mt_ser::{DefCfg, MtDeserialize, MtSerialize};
6 use std::{borrow::Cow, io};
9 #[derive(Error, Debug)]
11 #[error("connection error: {0}")]
12 ConnError(#[from] RudpError),
13 #[error("deserialize error: {0}")]
14 DeserializeError(#[from] mt_ser::DeserializeError),
17 #[derive(Error, Debug)]
19 #[error("connection error: {0}")]
20 ConnError(#[from] io::Error),
21 #[error("serialize error: {0}")]
22 SerializeError(#[from] mt_ser::SerializeError),
27 type Pkt: MtSerialize + PktInfo + Send + Sync;
29 async fn send_raw(&self, pkt: Pkt<'_>) -> io::Result<Ack>;
30 async fn send(&self, pkt: &Self::Pkt) -> Result<Ack, SendError> {
31 let mut writer = Vec::new();
32 pkt.mt_serialize::<DefCfg>(&mut writer)?;
34 let (chan, unrel) = pkt.pkt_info();
39 data: Cow::Borrowed(&writer),
46 pub trait ReceiverExt {
47 type Pkt: MtDeserialize;
49 async fn recv_raw(&mut self) -> Option<Result<Pkt<'static>, RudpError>>;
50 async fn recv(&mut self) -> Option<Result<Self::Pkt, RecvError>> {
51 self.recv_raw().await.map(|res| {
52 res.map_err(RecvError::from).and_then(|pkt| {
53 // TODO: warn on trailing data
54 Self::Pkt::mt_deserialize::<DefCfg>(&mut io::Cursor::new(pkt.data))
55 .map_err(RecvError::from)
61 #[cfg(feature = "client")]
62 pub use mt_rudp::{connect, CltReceiver, CltSender, CltWorker};
64 #[cfg(feature = "client")]
66 impl ReceiverExt for CltReceiver {
67 type Pkt = crate::ToCltPkt;
69 async fn recv_raw(&mut self) -> Option<Result<Pkt<'static>, RudpError>> {
70 self.recv_rudp().await
74 #[cfg(feature = "client")]
76 impl SenderExt for CltSender {
77 type Pkt = crate::ToSrvPkt;
79 async fn send_raw(&self, pkt: Pkt<'_>) -> io::Result<Ack> {
80 self.send_rudp(pkt).await