1 use futures_core::ready;
2 use futures_core::task::{Context, Poll};
3 use futures_io::{AsyncRead, IoSliceMut};
4 use std::fmt;
5 use std::io;
6 use std::pin::Pin;
7 
8 /// Reader for the [`repeat()`] function.
9 #[must_use = "readers do nothing unless polled"]
10 pub struct Repeat {
11     byte: u8,
12 }
13 
14 /// Creates an instance of a reader that infinitely repeats one byte.
15 ///
16 /// All reads from this reader will succeed by filling the specified buffer with
17 /// the given byte.
18 ///
19 /// # Examples
20 ///
21 /// ```
22 /// # futures::executor::block_on(async {
23 /// use futures::io::{self, AsyncReadExt};
24 ///
25 /// let mut buffer = [0; 3];
26 /// let mut reader = io::repeat(0b101);
27 /// reader.read_exact(&mut buffer).await.unwrap();
28 /// assert_eq!(buffer, [0b101, 0b101, 0b101]);
29 /// # Ok::<(), Box<dyn std::error::Error>>(()) }).unwrap();
30 /// ```
repeat(byte: u8) -> Repeat31 pub fn repeat(byte: u8) -> Repeat {
32     Repeat { byte }
33 }
34 
35 impl AsyncRead for Repeat {
36     #[inline]
poll_read( self: Pin<&mut Self>, _: &mut Context<'_>, buf: &mut [u8], ) -> Poll<io::Result<usize>>37     fn poll_read(
38         self: Pin<&mut Self>,
39         _: &mut Context<'_>,
40         buf: &mut [u8],
41     ) -> Poll<io::Result<usize>> {
42         for slot in &mut *buf {
43             *slot = self.byte;
44         }
45         Poll::Ready(Ok(buf.len()))
46     }
47 
48     #[inline]
poll_read_vectored( mut self: Pin<&mut Self>, cx: &mut Context<'_>, bufs: &mut [IoSliceMut<'_>], ) -> Poll<io::Result<usize>>49     fn poll_read_vectored(
50         mut self: Pin<&mut Self>,
51         cx: &mut Context<'_>,
52         bufs: &mut [IoSliceMut<'_>],
53     ) -> Poll<io::Result<usize>> {
54         let mut nwritten = 0;
55         for buf in bufs {
56             nwritten += ready!(self.as_mut().poll_read(cx, buf))?;
57         }
58         Poll::Ready(Ok(nwritten))
59     }
60 }
61 
62 impl fmt::Debug for Repeat {
fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result63     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
64         f.pad("Repeat { .. }")
65     }
66 }
67