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}