xwt_dyn/session/
datagram.rs1#![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}