Skip to main content

xwt_dyn/session/
datagram.rs

1#![allow(missing_docs)]
2
3use alloc::boxed::Box;
4use xwt_core::utils::maybe;
5
6use crate::utils::traits::{maybe_send, maybe_send_sync};
7
8#[dyn_safe::dyn_safe(true)]
9pub trait IncomingDatagram: maybe::Send + AsRef<[u8]> {}
10
11impl<X> IncomingDatagram for X where X: maybe::Send + AsRef<[u8]> {}
12
13#[dyn_safe::dyn_safe(true)]
14pub trait Receive: maybe::Send {
15    fn receive_datagram(
16        &self,
17    ) -> maybe_send::BoxedFuture<
18        '_,
19        Result<Box<dyn IncomingDatagram>, maybe_send_sync::BoxedError<'static>>,
20    >;
21}
22
23impl<X> Receive for X
24where
25    X: xwt_core::session::datagram::Receive,
26    X: 'static,
27    X: maybe::Sync,
28{
29    fn receive_datagram(
30        &self,
31    ) -> maybe_send::BoxedFuture<
32        '_,
33        Result<Box<dyn IncomingDatagram>, maybe_send_sync::BoxedError<'static>>,
34    > {
35        Box::pin(async move {
36            <X as xwt_core::session::datagram::Receive>::receive_datagram(self)
37                .await
38                .map(|val| Box::new(val) as _)
39                .map_err(|error| Box::new(error) as _)
40        })
41    }
42}
43
44#[dyn_safe::dyn_safe(true)]
45pub trait ReceiveInto: maybe::Send {
46    fn receive_datagram_into<'a>(
47        &'a self,
48        buf: &'a mut [u8],
49    ) -> maybe_send::BoxedFuture<'a, Result<usize, maybe_send_sync::BoxedError<'static>>>;
50}
51
52impl<X> ReceiveInto for X
53where
54    X: xwt_core::session::datagram::ReceiveInto,
55    X: 'static,
56    X: maybe::Sync,
57{
58    fn receive_datagram_into<'a>(
59        &'a self,
60        buf: &'a mut [u8],
61    ) -> maybe_send::BoxedFuture<'a, Result<usize, maybe_send_sync::BoxedError<'static>>> {
62        Box::pin(async move {
63            <X as xwt_core::session::datagram::ReceiveInto>::receive_datagram_into(self, buf)
64                .await
65                .map_err(|error| Box::new(error) as _)
66        })
67    }
68}
69
70#[dyn_safe::dyn_safe(true)]
71pub trait Send: maybe::Send {
72    fn send_datagram<'a>(
73        &'a self,
74        payload: &'a [u8],
75    ) -> maybe_send::BoxedFuture<'a, Result<(), maybe_send_sync::BoxedError<'static>>>;
76}
77
78impl<X> Send for X
79where
80    X: xwt_core::session::datagram::Send,
81    X: 'static,
82    X: maybe::Sync,
83{
84    fn send_datagram<'a>(
85        &'a self,
86        payload: &'a [u8],
87    ) -> maybe_send::BoxedFuture<'a, Result<(), maybe_send_sync::BoxedError<'static>>> {
88        Box::pin(async move {
89            <X as xwt_core::session::datagram::Send>::send_datagram(self, payload)
90                .await
91                .map_err(|error| Box::new(error) as _)
92        })
93    }
94}