zestors_request/
lib.rs

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//------------------------------------------------------------------------------------------------
13//  Request
14//------------------------------------------------------------------------------------------------
15
16#[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}