ferrite_session/internal/protocol/channel/
receive.rs1use 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}