leodos_protocols/datalink/link/
asymmetric.rs1use crate::datalink::{DatalinkRead, DatalinkWrite};
2
3pub struct AsymmetricLink<S, R> {
5 sender: S,
6 receiver: R,
7}
8
9impl<S, R> AsymmetricLink<S, R> {
10 pub fn new(sender: S, receiver: R) -> Self {
12 Self { sender, receiver }
13 }
14}
15
16#[derive(Debug, Clone, thiserror::Error)]
18pub enum AsymmetricLinkError<SE, RE> {
19 #[error("send error: {0}")]
21 Send(SE),
22 #[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}