async_compression/tokio/bufread/generic/
mod.rs

1mod decoder;
2mod encoder;
3
4pub use self::{decoder::Decoder, encoder::Encoder};
5
6use crate::core::util::WriteBuffer;
7use std::{io::Result, task::Poll};
8use tokio::io::ReadBuf;
9
10fn poll_read(
11    buf: &mut ReadBuf<'_>,
12    do_poll_read: impl FnOnce(&mut WriteBuffer<'_>) -> Poll<Result<()>>,
13) -> Poll<Result<()>> {
14    if buf.remaining() == 0 {
15        return Poll::Ready(Ok(()));
16    }
17
18    let initialized = buf.initialized().len() - buf.filled().len();
19    // Safety: `WriteBuffer` has the same safety invariant as `ReadBuf`
20    let mut output = WriteBuffer::new_uninitialized(unsafe { buf.unfilled_mut() });
21    // Safety: `ReadBuf` ensures that it is initialized
22    unsafe { output.assume_init(initialized) };
23
24    let res = do_poll_read(&mut output);
25
26    let initialized = output.initialized_len();
27    let written = output.written_len();
28
29    // Safety: We trust our implementation to have properly initialized it
30    unsafe { buf.assume_init(initialized) };
31    buf.advance(written);
32
33    res
34}