diff --git a/src/io/write/mod.rs b/src/io/write/mod.rs index 169c9e1e..bb03d901 100644 --- a/src/io/write/mod.rs +++ b/src/io/write/mod.rs @@ -234,6 +234,9 @@ extension_trait! { where Self: Unpin, { + // In order to not have to implement an async version of `fmt` including private types + // and all, we convert `Arguments` to a `Result>` and pass that to the Future. + // Doing an owned conversion saves us from juggling references. let mut string = String::new(); let res = std::fmt::write(&mut string, fmt) .map(|_| string.into_bytes()) diff --git a/src/io/write/write_fmt.rs b/src/io/write/write_fmt.rs index 9c8187ab..bd2dd673 100644 --- a/src/io/write/write_fmt.rs +++ b/src/io/write/write_fmt.rs @@ -17,7 +17,6 @@ impl Future for WriteFmtFuture<'_, T> { type Output = io::Result<()>; fn poll(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll { - // Process the interal Result the first time we run. if self.buffer.is_none() { match self.res.take().unwrap() { @@ -26,15 +25,16 @@ impl Future for WriteFmtFuture<'_, T> { }; } + // Get the types from the future. let Self { writer, amt, buffer, .. } = &mut *self; let mut buffer = buffer.as_mut().unwrap(); + // Copy the data from the buffer into the writer until it's done. loop { if buffer.is_empty() { futures_core::ready!(Pin::new(&mut **writer).poll_flush(cx))?; return Poll::Ready(Ok(())); } - let i = futures_core::ready!(Pin::new(&mut **writer).poll_write(cx, &mut buffer))?; if i == 0 { return Poll::Ready(Err(io::ErrorKind::WriteZero.into()));