use std::io::Cursor;
use compio_buf::IoBuf;
use crate::IoResult;
pub trait AsyncReadManaged {
type Buffer: IoBuf;
async fn read_managed(&mut self, len: usize) -> IoResult<Option<Self::Buffer>>;
}
pub trait AsyncReadManagedAt {
type Buffer: IoBuf;
async fn read_managed_at(&self, len: usize, pos: u64) -> IoResult<Option<Self::Buffer>>;
}
impl<A: AsyncReadManagedAt> AsyncReadManaged for Cursor<A> {
type Buffer = A::Buffer;
async fn read_managed(&mut self, len: usize) -> IoResult<Option<Self::Buffer>> {
let pos = self.position();
let Some(buf) = self.get_ref().read_managed_at(len, pos).await? else {
return Ok(None);
};
self.set_position(pos + buf.buf_len() as u64);
Ok(Some(buf))
}
}