use std::io;
use std::io::BufRead;
use std::io::Read;
use std::io::Seek;
use std::io::SeekFrom;
use futures::AsyncBufReadExt;
use futures::AsyncReadExt;
use futures::AsyncSeekExt;
use crate::*;
pub struct StdReader {
handle: tokio::runtime::Handle,
r: Option<FuturesAsyncReader>,
}
impl StdReader {
#[inline]
pub(super) fn new(handle: tokio::runtime::Handle, r: FuturesAsyncReader) -> Self {
Self { handle, r: Some(r) }
}
}
impl BufRead for StdReader {
fn fill_buf(&mut self) -> io::Result<&[u8]> {
let Some(r) = self.r.as_mut() else {
return Err(Error::new(ErrorKind::Unexpected, "reader has been dropped").into());
};
self.handle.block_on(r.fill_buf())
}
fn consume(&mut self, amt: usize) {
let Some(r) = self.r.as_mut() else {
return;
};
r.consume_unpin(amt);
}
}
impl Read for StdReader {
#[inline]
fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
let Some(r) = self.r.as_mut() else {
return Err(Error::new(ErrorKind::Unexpected, "reader has been dropped").into());
};
self.handle.block_on(r.read(buf))
}
}
impl Seek for StdReader {
#[inline]
fn seek(&mut self, pos: SeekFrom) -> io::Result<u64> {
let Some(r) = self.r.as_mut() else {
return Err(Error::new(ErrorKind::Unexpected, "reader has been dropped").into());
};
self.handle.block_on(r.seek(pos))
}
}
impl Drop for StdReader {
fn drop(&mut self) {
if let Some(v) = self.r.take() {
self.handle.block_on(async move { drop(v) });
}
}
}