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