| use futures_core::task::{Context, Poll}; |
| use futures_io::{AsyncWrite, IoSlice}; |
| use std::fmt; |
| use std::io; |
| use std::pin::Pin; |
| |
| /// Writer for the [`sink()`] function. |
| #[must_use = "writers do nothing unless polled"] |
| pub struct Sink { |
| _priv: (), |
| } |
| |
| /// Creates an instance of a writer which will successfully consume all data. |
| /// |
| /// All calls to `poll_write` on the returned instance will return `Poll::Ready(Ok(buf.len()))` |
| /// and the contents of the buffer will not be inspected. |
| /// |
| /// # Examples |
| /// |
| /// ```rust |
| /// # futures::executor::block_on(async { |
| /// use futures::io::{self, AsyncWriteExt}; |
| /// |
| /// let buffer = vec![1, 2, 3, 5, 8]; |
| /// let mut writer = io::sink(); |
| /// let num_bytes = writer.write(&buffer).await?; |
| /// assert_eq!(num_bytes, 5); |
| /// # Ok::<(), Box<dyn std::error::Error>>(()) }).unwrap(); |
| /// ``` |
| pub fn sink() -> Sink { |
| Sink { _priv: () } |
| } |
| |
| impl AsyncWrite for Sink { |
| #[inline] |
| fn poll_write( |
| self: Pin<&mut Self>, |
| _: &mut Context<'_>, |
| buf: &[u8], |
| ) -> Poll<io::Result<usize>> { |
| Poll::Ready(Ok(buf.len())) |
| } |
| |
| #[inline] |
| fn poll_write_vectored( |
| self: Pin<&mut Self>, |
| _: &mut Context<'_>, |
| bufs: &[IoSlice<'_>], |
| ) -> Poll<io::Result<usize>> { |
| Poll::Ready(Ok(bufs.iter().map(|b| b.len()).sum())) |
| } |
| |
| #[inline] |
| fn poll_flush(self: Pin<&mut Self>, _: &mut Context<'_>) -> Poll<io::Result<()>> { |
| Poll::Ready(Ok(())) |
| } |
| #[inline] |
| fn poll_close(self: Pin<&mut Self>, _: &mut Context<'_>) -> Poll<io::Result<()>> { |
| Poll::Ready(Ok(())) |
| } |
| } |
| |
| impl fmt::Debug for Sink { |
| fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { |
| f.pad("Sink { .. }") |
| } |
| } |