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}