Skip to main content

ferrite_session/internal/protocol/shared/
shared_to_linear.rs

1use core::{
2  future::Future,
3  pin::Pin,
4};
5use std::marker::PhantomData;
6
7use super::linear_to_shared::LinearToShared;
8use crate::internal::base::*;
9
10pub struct SharedToLinear<F>(PhantomData<F>);
11
12impl<F> SealedProtocol for SharedToLinear<LinearToShared<F>> {}
13
14impl<F> Protocol for SharedToLinear<LinearToShared<F>>
15where
16  F: Send + 'static,
17  F: SharedRecApp<SharedToLinear<LinearToShared<F>>>,
18{
19  type ClientEndpoint = SenderOnce<()>;
20  type ProviderEndpoint = ReceiverOnce<()>;
21
22  fn create_endpoints() -> (Self::ProviderEndpoint, Self::ClientEndpoint)
23  {
24    let (sender, receiver) = once_channel();
25    (receiver, sender)
26  }
27
28  fn forward(
29    client_end: Self::ClientEndpoint,
30    provider_end: Self::ProviderEndpoint,
31  ) -> Pin<Box<dyn Future<Output = ()> + Send + 'static>>
32  {
33    Box::pin(async {
34      let payload = provider_end.recv().await.unwrap();
35      client_end.send(payload).unwrap();
36    })
37  }
38}