async_std/io/write/
write_fmt.rs1use std::pin::Pin;
2use std::future::Future;
3
4use crate::io::{self, Write};
5use crate::task::{Context, Poll};
6
7#[doc(hidden)]
8#[allow(missing_debug_implementations)]
9#[must_use]
10pub struct WriteFmtFuture<'a, T: Unpin + ?Sized> {
11 pub(crate) writer: &'a mut T,
12 pub(crate) res: Option<io::Result<Vec<u8>>>,
13 pub(crate) buffer: Option<Vec<u8>>,
14 pub(crate) amt: usize,
15}
16
17impl<T: Write + Unpin + ?Sized> Future for WriteFmtFuture<'_, T> {
18 type Output = io::Result<()>;
19
20 fn poll(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> {
21 if self.buffer.is_none() {
23 match self.res.take().unwrap() {
24 Err(err) => return Poll::Ready(Err(err)),
25 Ok(buffer) => self.buffer = Some(buffer),
26 };
27 }
28
29 let Self {
31 writer,
32 amt,
33 buffer,
34 ..
35 } = &mut *self;
36 let buffer = buffer.as_mut().unwrap();
37
38 loop {
40 if *amt == buffer.len() {
41 futures_core::ready!(Pin::new(&mut **writer).poll_flush(cx))?;
42 return Poll::Ready(Ok(()));
43 }
44 let i = futures_core::ready!(Pin::new(&mut **writer).poll_write(cx, &buffer[*amt..]))?;
45 if i == 0 {
46 return Poll::Ready(Err(io::ErrorKind::WriteZero.into()));
47 }
48 *amt += i;
49 }
50 }
51}