use futures_core::ready; use futures_core::task::{Context, Poll}; use futures_io::AsyncWrite; use futures_sink::Sink; use pin_project_lite::pin_project; use std::io; use std::pin::Pin;
pin_project! { /// Sink for the [`into_sink`](super::AsyncWriteExt::into_sink) method. #[must_use = "sinks do nothing unless polled"] #[derive(Debug)] #[cfg_attr(docsrs, doc(cfg(feature = "sink")))] pubstruct IntoSink<W, Item> { #[pin]
writer: W, // An outstanding block for us to push into the underlying writer, along with an offset of how // far into this block we have written already.
buffer: Option<Block<Item>>,
}
}
/// If we have an outstanding block in `buffer` attempt to push it into the writer, does _not_ /// flush the writer after it succeeds in pushing the block into it. fn poll_flush_buffer( self: Pin<&mutSelf>,
cx: &mut Context<'_>,
) -> Poll<Result<(), io::Error>> { letmut this = self.project();
iflet Some(buffer) = this.buffer { loop { let bytes = buffer.bytes.as_ref(); let written = ready!(this.writer.as_mut().poll_write(cx, &bytes[buffer.offset..]))?;
buffer.offset += written; if buffer.offset == bytes.len() { break;
}
}
}
*this.buffer = None;
Poll::Ready(Ok(()))
}
}
impl<W: AsyncWrite, Item: AsRef<[u8]>> Sink<Item> for IntoSink<W, Item> { type Error = io::Error;
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.