use futures::Future;
use crate::raw::oio::ReadStream;
use crate::raw::*;
use crate::*;
pub trait StreamRead: Send + Sync + Unpin + 'static {
fn open(
&self,
range: BytesRange,
) -> impl Future<Output = Result<(RpRead, Box<dyn oio::ReadStreamDyn>)>> + MaybeSend;
}
pub struct StreamReader<R: StreamRead> {
inner: R,
}
impl<R: StreamRead> StreamReader<R> {
pub fn new(inner: R) -> Self {
Self { inner }
}
pub fn into_inner(self) -> R {
self.inner
}
}
impl<R: StreamRead> oio::Read for StreamReader<R> {
async fn open(&self, range: BytesRange) -> Result<(RpRead, Box<dyn oio::ReadStreamDyn>)> {
self.inner.open(range).await
}
async fn read(&self, range: BytesRange) -> Result<(RpRead, Buffer)> {
let expected = range
.size()
.ok_or_else(|| Error::new(ErrorKind::Unsupported, "read requires a bounded range"))?;
let (rp, mut stream) = self.inner.open(range).await?;
let buffer = stream.read_all().await?;
if buffer.len() as u64 != expected {
return Err(
Error::new(ErrorKind::Unexpected, "reader got unexpected data size")
.with_context("expect", expected)
.with_context("actual", buffer.len() as u64),
);
}
Ok((rp, buffer))
}
}