Skip to main content

ferrite_session/internal/protocol/channel/
receive.rs

1use core::{
2  future::Future,
3  marker::PhantomData,
4  pin::Pin,
5};
6
7use crate::internal::base::*;
8
9pub struct ReceiveChannel<A, B>(PhantomData<(A, B)>);
10
11impl<A, B> SealedProtocol for ReceiveChannel<A, B> {}
12
13impl<A, B> Protocol for ReceiveChannel<A, B>
14where
15  A: Protocol,
16  B: Protocol,
17{
18  type ClientEndpoint = (SenderOnce<A::ClientEndpoint>, B::ClientEndpoint);
19  type ProviderEndpoint =
20    (ReceiverOnce<A::ClientEndpoint>, B::ProviderEndpoint);
21
22  fn create_endpoints() -> (Self::ProviderEndpoint, Self::ClientEndpoint)
23  {
24    let (chan_sender, chan_receiver) = once_channel();
25    let (provider_end, client_end) = B::create_endpoints();
26
27    ((chan_receiver, provider_end), (chan_sender, client_end))
28  }
29
30  fn forward(
31    client_end: Self::ClientEndpoint,
32    provider_end: Self::ProviderEndpoint,
33  ) -> Pin<Box<dyn Future<Output = ()> + Send + 'static>>
34  {
35    let (chan_sender, client_end_b) = client_end;
36    let (chan_receiver, provider_end_b) = provider_end;
37
38    Box::pin(async {
39      let chan = chan_receiver.recv().await.unwrap();
40      chan_sender.send(chan).unwrap();
41
42      B::forward(client_end_b, provider_end_b).await;
43    })
44  }
45}
46
47impl<A, P, Q> RecApp<A> for ReceiveChannel<P, Q>
48where
49  P: RecApp<A>,
50  Q: RecApp<A>,
51{
52  type Applied = ReceiveChannel<P::Applied, Q::Applied>;
53}
54
55impl<A, B, X> SharedRecApp<X> for ReceiveChannel<A, B>
56where
57  B: SharedRecApp<X>,
58{
59  type Applied = ReceiveChannel<A, B::Applied>;
60}