with_daemon 0.2.1

An async client-daemon abstraction framework
Documentation
use tokio::sync::mpsc;

pub struct Waiter {
    receiver: mpsc::Receiver<()>,
    token: Token,
}

#[derive(Clone)]
pub struct Token(#[allow(dead_code)] mpsc::Sender<()>);

impl Waiter {
    pub fn new() -> Self {
        let (sender, receiver) = mpsc::channel::<()>(1);
        Self {
            receiver,
            token: Token(sender),
        }
    }

    pub fn token(&self) -> Token {
        self.token.clone()
    }

    pub async fn wait(mut self) {
        drop(self.token);
        let res = self.receiver.recv().await;
        assert!(res.is_none());
    }
}