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}