relm4/channel/shutdown/
receiver.rs

1// Copyright 2022 System76 <info@system76.com>
2// SPDX-License-Identifier: MIT or Apache-2.0
3
4use super::AttachedShutdown;
5use super::broadcast::Receiver;
6
7#[cfg(test)]
8use super::broadcast::error::TryRecvError;
9
10/// Listens to shutdown signals and constructs shutdown futures.
11#[derive(Debug)]
12pub struct ShutdownReceiver {
13    pub(super) receiver: Receiver<()>,
14}
15
16impl ShutdownReceiver {
17    /// Create a future which will be cancelled on shutdown.
18    pub fn register<F>(self, future: F) -> AttachedShutdown<F> {
19        AttachedShutdown {
20            receiver: self,
21            future,
22        }
23    }
24
25    /// Waits until a shutdown signal is received.
26    pub async fn wait(mut self) {
27        let _ = self.receiver.recv().await;
28    }
29
30    #[cfg(test)]
31    pub(crate) fn try_recv(&mut self) -> Result<(), TryRecvError> {
32        self.receiver.try_recv()
33    }
34}
35
36impl Clone for ShutdownReceiver {
37    fn clone(&self) -> Self {
38        Self {
39            receiver: self.receiver.resubscribe(),
40        }
41    }
42}