1use crate::io::util::poll_proceed_and_make_progress;
2use crate::io::AsyncWrite;
3
4use std::fmt;
5use std::io;
6use std::pin::Pin;
7use std::task::{Context, Poll};
8
9cfg_io_util! {
10 /// An async writer which will move data into the void.
11 ///
12 /// This struct is generally created by calling [`sink`][sink]. Please
13 /// see the documentation of `sink()` for more details.
14 ///
15 /// This is an asynchronous version of [`std::io::Sink`][std].
16 ///
17 /// [sink]: sink()
18 /// [std]: std::io::Sink
19 pub struct Sink {
20 _p: (),
21 }
22
23 /// Creates an instance of an async writer which will successfully consume all
24 /// data.
25 ///
26 /// All calls to [`poll_write`] on the returned instance will return
27 /// `Poll::Ready(Ok(buf.len()))` and the contents of the buffer will not be
28 /// inspected.
29 ///
30 /// This is an asynchronous version of [`std::io::sink`][std].
31 ///
32 /// [`poll_write`]: crate::io::AsyncWrite::poll_write()
33 /// [std]: std::io::sink
34 ///
35 /// # Examples
36 ///
37 /// ```
38 /// use tokio::io::{self, AsyncWriteExt};
39 ///
40 /// #[tokio::main]
41 /// async fn main() -> io::Result<()> {
42 /// let buffer = vec![1, 2, 3, 5, 8];
43 /// let num_bytes = io::sink().write(&buffer).await?;
44 /// assert_eq!(num_bytes, 5);
45 /// Ok(())
46 /// }
47 /// ```
48 pub fn sink() -> Sink {
49 Sink { _p: () }
50 }
51}
52
53impl AsyncWrite for Sink {
54 #[inline]
55 fn poll_write(
56 self: Pin<&mut Self>,
57 cx: &mut Context<'_>,
58 buf: &[u8],
59 ) -> Poll<Result<usize, io::Error>> {
60 ready!(crate::trace::trace_leaf(cx));
61 ready!(poll_proceed_and_make_progress(cx));
62 Poll::Ready(Ok(buf.len()))
63 }
64
65 #[inline]
66 fn poll_flush(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Result<(), io::Error>> {
67 ready!(crate::trace::trace_leaf(cx));
68 ready!(poll_proceed_and_make_progress(cx));
69 Poll::Ready(Ok(()))
70 }
71
72 #[inline]
73 fn poll_shutdown(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Result<(), io::Error>> {
74 ready!(crate::trace::trace_leaf(cx));
75 ready!(poll_proceed_and_make_progress(cx));
76 Poll::Ready(Ok(()))
77 }
78}
79
80impl fmt::Debug for Sink {
81 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
82 f.pad("Sink { .. }")
83 }
84}
85
86#[cfg(test)]
87mod tests {
88 use super::*;
89
90 #[test]
91 fn assert_unpin() {
92 crate::is_unpin::<Sink>();
93 }
94}
95