use std::fmt::Debug;
use std::fmt::Formatter;
use std::fmt::Result as FmtResult;
use std::io::Result as IoResult;
use std::pin::Pin;
use std::task::Context;
use std::task::Poll;
use qubit_io::AsyncInput;
use qubit_io::BoxAsyncInput;
use crate::metadata::OpenedFileInfo;
pub struct AsyncFileReader {
inner: BoxAsyncInput<dyn AsyncInput<Item = u8> + Send>,
info: OpenedFileInfo,
}
impl AsyncFileReader {
#[inline]
#[must_use]
pub(crate) fn new(info: OpenedFileInfo, inner: Box<dyn AsyncInput<Item = u8> + Send>) -> Self {
Self {
inner: BoxAsyncInput::new(inner),
info,
}
}
#[inline]
#[must_use]
pub fn info(&self) -> &OpenedFileInfo {
&self.info
}
}
impl AsyncInput for AsyncFileReader {
type Item = u8;
#[inline]
fn is_buffered(&self) -> bool {
self.inner.is_buffered()
}
#[inline]
unsafe fn poll_read_unchecked(
self: Pin<&mut Self>,
cx: &mut Context<'_>,
output: &mut [u8],
index: usize,
count: usize,
) -> Poll<IoResult<usize>> {
let this = self.get_mut();
unsafe {
Pin::new(&mut this.inner)
.get_pin_mut()
.poll_read_unchecked(cx, output, index, count)
}
}
}
impl Debug for AsyncFileReader {
#[inline]
fn fmt(&self, formatter: &mut Formatter<'_>) -> FmtResult {
formatter
.debug_struct("AsyncFileReader")
.field("info", &self.info)
.finish_non_exhaustive()
}
}