tokio_stream/wrappers/
signal_windows.rs

1use crate::Stream;
2use std::pin::Pin;
3use std::task::{Context, Poll};
4use tokio::signal::windows::{CtrlBreak, CtrlC};
5
6/// A wrapper around [`CtrlC`] that implements [`Stream`].
7///
8/// [`CtrlC`]: struct@tokio::signal::windows::CtrlC
9/// [`Stream`]: trait@crate::Stream
10///
11/// # Example
12///
13/// ```no_run
14/// use tokio::signal::windows::ctrl_c;
15/// use tokio_stream::{StreamExt, wrappers::CtrlCStream};
16///
17/// # #[tokio::main(flavor = "current_thread")]
18/// # async fn main() -> std::io::Result<()> {
19/// let signals = ctrl_c()?;
20/// let mut stream = CtrlCStream::new(signals);
21/// while stream.next().await.is_some() {
22///     println!("ctrl-c received");
23/// }
24/// # Ok(())
25/// # }
26/// ```
27#[derive(Debug)]
28#[cfg_attr(docsrs, doc(cfg(all(windows, feature = "signal"))))]
29pub struct CtrlCStream {
30    inner: CtrlC,
31}
32
33impl CtrlCStream {
34    /// Create a new `CtrlCStream`.
35    pub fn new(interval: CtrlC) -> Self {
36        Self { inner: interval }
37    }
38
39    /// Get back the inner `CtrlC`.
40    pub fn into_inner(self) -> CtrlC {
41        self.inner
42    }
43}
44
45impl Stream for CtrlCStream {
46    type Item = ();
47
48    fn poll_next(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Option<()>> {
49        self.inner.poll_recv(cx)
50    }
51}
52
53impl AsRef<CtrlC> for CtrlCStream {
54    fn as_ref(&self) -> &CtrlC {
55        &self.inner
56    }
57}
58
59impl AsMut<CtrlC> for CtrlCStream {
60    fn as_mut(&mut self) -> &mut CtrlC {
61        &mut self.inner
62    }
63}
64
65/// A wrapper around [`CtrlBreak`] that implements [`Stream`].
66///
67/// # Example
68///
69/// ```no_run
70/// use tokio::signal::windows::ctrl_break;
71/// use tokio_stream::{StreamExt, wrappers::CtrlBreakStream};
72///
73/// # #[tokio::main(flavor = "current_thread")]
74/// # async fn main() -> std::io::Result<()> {
75/// let signals = ctrl_break()?;
76/// let mut stream = CtrlBreakStream::new(signals);
77/// while stream.next().await.is_some() {
78///     println!("ctrl-break received");
79/// }
80/// # Ok(())
81/// # }
82/// ```
83///
84/// [`CtrlBreak`]: struct@tokio::signal::windows::CtrlBreak
85/// [`Stream`]: trait@crate::Stream
86#[derive(Debug)]
87#[cfg_attr(docsrs, doc(cfg(all(windows, feature = "signal"))))]
88pub struct CtrlBreakStream {
89    inner: CtrlBreak,
90}
91
92impl CtrlBreakStream {
93    /// Create a new `CtrlBreakStream`.
94    pub fn new(interval: CtrlBreak) -> Self {
95        Self { inner: interval }
96    }
97
98    /// Get back the inner `CtrlBreak`.
99    pub fn into_inner(self) -> CtrlBreak {
100        self.inner
101    }
102}
103
104impl Stream for CtrlBreakStream {
105    type Item = ();
106
107    fn poll_next(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Option<()>> {
108        self.inner.poll_recv(cx)
109    }
110}
111
112impl AsRef<CtrlBreak> for CtrlBreakStream {
113    fn as_ref(&self) -> &CtrlBreak {
114        &self.inner
115    }
116}
117
118impl AsMut<CtrlBreak> for CtrlBreakStream {
119    fn as_mut(&mut self) -> &mut CtrlBreak {
120        &mut self.inner
121    }
122}