2 use delegate::delegate;
3 use mt_ser::{DefCfg, MtDeserialize, MtSerialize};
4 use std::{borrow::Cow, io};
8 type UdpSender: mt_rudp::UdpSender;
9 type PktFrom: MtDeserialize;
10 type PktTo: MtSerialize + PktInfo;
13 #[cfg(feature = "client")]
16 #[cfg(feature = "client")]
17 impl Remote for RemoteSrv {
18 type UdpSender = mt_rudp::ToSrv;
19 type PktTo = crate::ToSrvPkt;
20 type PktFrom = crate::ToCltPkt;
23 #[cfg(feature = "client")]
24 pub async fn connect(addr: &str) -> io::Result<(MtSender<RemoteSrv>, MtReceiver<RemoteSrv>)> {
25 let (tx, rx) = mt_rudp::connect(addr).await?;
26 Ok((MtSender(tx), MtReceiver(rx)))
32 impl Remote for RemoteClt {
33 type Sender = mt_rudp::ToClt;
34 type To = crate::ToCltPkt;
35 type From = crate::ToSrvPkt;
40 pub struct MtSender<R: Remote>(pub mt_rudp::RudpSender<R::UdpSender>);
41 pub struct MtReceiver<R: Remote>(pub mt_rudp::RudpReceiver<R::UdpSender>);
43 #[derive(Error, Debug)]
45 #[error("connection error: {0}")]
46 ConnError(#[from] mt_rudp::Error),
47 #[error("deserialize error: {0}")]
48 DeserializeError(#[from] mt_ser::DeserializeError),
51 #[derive(Error, Debug)]
53 #[error("connection error: {0}")]
54 ConnError(#[from] io::Error),
55 #[error("serialize error: {0}")]
56 SerializeError(#[from] mt_ser::SerializeError),
59 macro_rules! impl_delegate {
61 impl<R: Remote> $T<R> {
64 pub async fn peer_id(&self) -> u16;
65 pub async fn is_server(&self) -> bool;
66 pub async fn close(self);
73 impl_delegate!(MtSender);
74 impl_delegate!(MtReceiver);
76 impl<R: Remote> MtReceiver<R> {
77 pub async fn recv(&mut self) -> Option<Result<R::PktFrom, RecvError>> {
78 self.0.recv().await.map(|res| {
79 res.map_err(RecvError::from).and_then(|pkt| {
80 // TODO: warn on trailing data
81 R::PktFrom::mt_deserialize::<DefCfg>(&mut io::Cursor::new(pkt.data))
82 .map_err(RecvError::from)
88 impl<R: Remote> MtSender<R> {
89 pub async fn send(&self, pkt: &R::PktTo) -> Result<(), SendError> {
90 let mut writer = Vec::new();
91 pkt.mt_serialize::<DefCfg>(&mut writer)?;
93 let (chan, unrel) = pkt.pkt_info();
98 data: Cow::Borrowed(&writer),