1#![doc = include_str!("../README.md")]
2
3use std::marker::PhantomData;
4use tokio::sync::oneshot;
5use zestors_core::messaging::MessageType;
6
7mod into_recv;
8mod tx_rx;
9
10pub use {into_recv::*, tx_rx::*};
11
12#[derive(Debug, Clone, Copy)]
17pub struct Request<T>(PhantomData<T>);
18
19impl<T> Request<T> {
20 pub fn create() -> (Tx<T>, Rx<T>) {
21 let (tx, rx) = oneshot::channel();
22 (Tx(tx), Rx(rx))
23 }
24}
25
26impl<M, R> MessageType<M> for Request<R> {
27 type Sends = (M, Tx<R>);
28 type Returns = Rx<R>;
29
30 fn create(msg: M) -> ((M, Tx<R>), Rx<R>) {
31 let (tx, rx) = Request::create();
32 ((msg, tx), rx)
33 }
34
35 fn destroy(sends: (M, Tx<R>), _returns: Rx<R>) -> M {
36 sends.0
37 }
38}