rosrust/util/
kill.rs

1use crossbeam::channel;
2
3pub enum KillMode {
4    Sync,
5    Async,
6}
7
8impl KillMode {
9    fn into_channel<T>(self) -> (channel::Sender<T>, channel::Receiver<T>) {
10        match self {
11            KillMode::Sync => channel::bounded(0),
12            KillMode::Async => channel::unbounded(),
13        }
14    }
15}
16
17#[derive(Clone)]
18pub struct Sender {
19    pub kill_tx: channel::Sender<()>,
20}
21
22impl Sender {
23    pub fn send(&self) -> Result<(), channel::SendError<()>> {
24        self.kill_tx.send(())
25    }
26}
27
28pub struct Receiver {
29    pub kill_rx: channel::Receiver<()>,
30}
31
32impl Receiver {
33    pub fn try_recv(&self) -> Result<(), channel::TryRecvError> {
34        self.kill_rx.try_recv()
35    }
36}
37
38pub fn channel(kill_mode: KillMode) -> (Sender, Receiver) {
39    let (kill_tx, kill_rx) = kill_mode.into_channel();
40    (Sender { kill_tx }, Receiver { kill_rx })
41}