tokio_stream/wrappers/
signal_unix.rs

1use crate::Stream;
2use std::pin::Pin;
3use std::task::{Context, Poll};
4use tokio::signal::unix::Signal;
5
6/// A wrapper around [`Signal`] that implements [`Stream`].
7///
8/// # Example
9///
10/// ```no_run
11/// use tokio::signal::unix::{signal, SignalKind};
12/// use tokio_stream::{StreamExt, wrappers::SignalStream};
13///
14/// # #[tokio::main(flavor = "current_thread")]
15/// # async fn main() -> std::io::Result<()> {
16/// let signals = signal(SignalKind::hangup())?;
17/// let mut stream = SignalStream::new(signals);
18/// while stream.next().await.is_some() {
19///     println!("hangup signal received");
20/// }
21/// # Ok(())
22/// # }
23/// ```
24/// [`Signal`]: struct@tokio::signal::unix::Signal
25/// [`Stream`]: trait@crate::Stream
26#[derive(Debug)]
27#[cfg_attr(docsrs, doc(cfg(all(unix, feature = "signal"))))]
28pub struct SignalStream {
29    inner: Signal,
30}
31
32impl SignalStream {
33    /// Create a new `SignalStream`.
34    pub fn new(signal: Signal) -> Self {
35        Self { inner: signal }
36    }
37
38    /// Get back the inner `Signal`.
39    pub fn into_inner(self) -> Signal {
40        self.inner
41    }
42}
43
44impl Stream for SignalStream {
45    type Item = ();
46
47    fn poll_next(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Option<()>> {
48        self.inner.poll_recv(cx)
49    }
50}
51
52impl AsRef<Signal> for SignalStream {
53    fn as_ref(&self) -> &Signal {
54        &self.inner
55    }
56}
57
58impl AsMut<Signal> for SignalStream {
59    fn as_mut(&mut self) -> &mut Signal {
60        &mut self.inner
61    }
62}