Skip to main content

leodos_protocols/datalink/link/
asymmetric.rs

1use crate::datalink::{DatalinkRead, DatalinkWrite};
2
3/// A data link composed of separate sender and receiver halves.
4pub struct AsymmetricLink<S, R> {
5    sender: S,
6    receiver: R,
7}
8
9impl<S, R> AsymmetricLink<S, R> {
10    /// Creates a new asymmetric link from separate sender and receiver.
11    pub fn new(sender: S, receiver: R) -> Self {
12        Self { sender, receiver }
13    }
14}
15
16/// Errors from an asymmetric link, wrapping send or receive errors.
17#[derive(Debug, Clone, thiserror::Error)]
18pub enum AsymmetricLinkError<SE, RE> {
19    /// An error occurred during send.
20    #[error("send error: {0}")]
21    Send(SE),
22    /// An error occurred during receive.
23    #[error("recv error: {0}")]
24    Recv(RE),
25}
26
27impl<S, R> DatalinkWrite for AsymmetricLink<S, R>
28where
29    S: DatalinkWrite,
30    R: DatalinkRead,
31{
32    type Error = AsymmetricLinkError<S::Error, R::Error>;
33
34    async fn write(&mut self, data: &[u8]) -> Result<(), Self::Error> {
35        self.sender
36            .write(data)
37            .await
38            .map_err(AsymmetricLinkError::Send)
39    }
40}
41
42impl<S, R> DatalinkRead for AsymmetricLink<S, R>
43where
44    S: DatalinkWrite,
45    R: DatalinkRead,
46{
47    type Error = AsymmetricLinkError<S::Error, R::Error>;
48
49    async fn read(&mut self, buffer: &mut [u8]) -> Result<usize, Self::Error> {
50        self.receiver
51            .read(buffer)
52            .await
53            .map_err(AsymmetricLinkError::Recv)
54    }
55}