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