use std::mem;
use std::ops::DerefMut;
use bytes::Bytes;
use futures::Future;
use crate::raw::*;
use crate::*;
pub type Reader = Box<dyn ReadDyn>;
pub trait Read: Unpin + Send + Sync {
fn read(&mut self) -> impl Future<Output = Result<Buffer>> + MaybeSend;
fn read_all(&mut self) -> impl Future<Output = Result<Buffer>> + MaybeSend {
async {
let mut bufs = vec![];
loop {
match self.read().await {
Ok(buf) if buf.is_empty() => break,
Ok(buf) => bufs.push(buf),
Err(err) => return Err(err),
}
}
Ok(bufs.into_iter().flatten().collect())
}
}
}
impl Read for () {
async fn read(&mut self) -> Result<Buffer> {
Err(Error::new(
ErrorKind::Unsupported,
"output reader doesn't support read",
))
}
}
impl Read for Bytes {
async fn read(&mut self) -> Result<Buffer> {
Ok(Buffer::from(self.split_off(0)))
}
}
impl Read for Buffer {
async fn read(&mut self) -> Result<Buffer> {
Ok(mem::take(self))
}
}
pub trait ReadDyn: Unpin + Send + Sync {
fn read_dyn(&mut self) -> BoxedFuture<'_, Result<Buffer>>;
fn read_all_dyn(&mut self) -> BoxedFuture<'_, Result<Buffer>>;
}
impl<T: Read + ?Sized> ReadDyn for T {
fn read_dyn(&mut self) -> BoxedFuture<'_, Result<Buffer>> {
Box::pin(self.read())
}
fn read_all_dyn(&mut self) -> BoxedFuture<'_, Result<Buffer>> {
Box::pin(self.read_all())
}
}
impl<T: ReadDyn + ?Sized> Read for Box<T> {
async fn read(&mut self) -> Result<Buffer> {
self.deref_mut().read_dyn().await
}
async fn read_all(&mut self) -> Result<Buffer> {
self.deref_mut().read_all_dyn().await
}
}