1 use crate::Stream;
2 use std::pin::Pin;
3 use std::task::{Context, Poll};
4 use tokio::signal::unix::Signal;
5 
6 /// A wrapper around [`Signal`] that implements [`Stream`].
7 ///
8 /// [`Signal`]: struct@tokio::signal::unix::Signal
9 /// [`Stream`]: trait@crate::Stream
10 #[derive(Debug)]
11 #[cfg_attr(docsrs, doc(cfg(all(unix, feature = "signal"))))]
12 pub struct SignalStream {
13     inner: Signal,
14 }
15 
16 impl SignalStream {
17     /// Create a new `SignalStream`.
new(signal: Signal) -> Self18     pub fn new(signal: Signal) -> Self {
19         Self { inner: signal }
20     }
21 
22     /// Get back the inner `Signal`.
into_inner(self) -> Signal23     pub fn into_inner(self) -> Signal {
24         self.inner
25     }
26 }
27 
28 impl Stream for SignalStream {
29     type Item = ();
30 
poll_next(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Option<()>>31     fn poll_next(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Option<()>> {
32         self.inner.poll_recv(cx)
33     }
34 }
35 
36 impl AsRef<Signal> for SignalStream {
as_ref(&self) -> &Signal37     fn as_ref(&self) -> &Signal {
38         &self.inner
39     }
40 }
41 
42 impl AsMut<Signal> for SignalStream {
as_mut(&mut self) -> &mut Signal43     fn as_mut(&mut self) -> &mut Signal {
44         &mut self.inner
45     }
46 }
47