Skip to main content

compio_io/read/
managed.rs

1use std::io::Cursor;
2
3use compio_buf::IoBuf;
4
5use crate::IoResult;
6
7/// # AsyncReadManaged
8///
9/// Async read with buffer pool
10pub trait AsyncReadManaged {
11    /// Filled buffer type
12    type Buffer: IoBuf;
13
14    /// Read some bytes from this source and return a [`Self::Buffer`].
15    ///
16    /// Returning `Ok(None)` is similar to `Ok(0)` for normal [`AsyncRead`].
17    ///
18    /// # Implementation Note
19    ///
20    /// - If `len` == 0, implementation should use buffer's size as `len`
21    /// - if `len` > 0, `min(len, buffer_size)` will be the max number of bytes
22    ///   to be read.
23    ///
24    /// [`AsyncRead`]: crate::AsyncRead
25    async fn read_managed(&mut self, len: usize) -> IoResult<Option<Self::Buffer>>;
26}
27
28/// # AsyncReadAtManaged
29///
30/// Async read with buffer pool and position
31pub trait AsyncReadManagedAt {
32    /// Filled buffer type
33    type Buffer: IoBuf;
34
35    /// Read some bytes from this source at position and return a
36    /// [`Self::Buffer`].
37    ///
38    /// Returning `Ok(None)` is similar to `Ok(0)` for normal [`AsyncReadAt`].
39    ///
40    /// # Implementation Note
41    ///
42    /// - If `len` == 0, implementation should use buffer's size as `len`
43    /// - if `len` > 0, `min(len, buffer_size)` will be the max number of bytes
44    ///   to be read.
45    ///
46    /// [`AsyncReadAt`]: crate::AsyncReadAt
47    async fn read_managed_at(&self, len: usize, pos: u64) -> IoResult<Option<Self::Buffer>>;
48}
49
50impl<A: AsyncReadManagedAt> AsyncReadManaged for Cursor<A> {
51    type Buffer = A::Buffer;
52
53    async fn read_managed(&mut self, len: usize) -> IoResult<Option<Self::Buffer>> {
54        let pos = self.position();
55        let Some(buf) = self.get_ref().read_managed_at(len, pos).await? else {
56            return Ok(None);
57        };
58        self.set_position(pos + buf.buf_len() as u64);
59        Ok(Some(buf))
60    }
61}