use base_scheduler::{Cancellation, OperationResult, SocketStreamReader, SocketStreamWriter};
use std::{future::Future, io};
pub trait ReadableStream: Send {
fn read_into(
&mut self,
buffer: &mut [u8],
cancellation: &Cancellation,
) -> impl Future<Output = OperationResult<usize>> + Send;
fn close(&mut self) -> impl Future<Output = io::Result<()>> + Send;
}
pub trait WritableStream: Send {
fn write(
&mut self,
buffer: &[u8],
cancellation: &Cancellation,
) -> impl Future<Output = OperationResult<usize>> + Send;
fn flush(
&mut self,
cancellation: &Cancellation,
) -> impl Future<Output = OperationResult<()>> + Send;
fn close(&mut self) -> impl Future<Output = io::Result<()>> + Send;
}
impl<R: SocketStreamReader> ReadableStream for R {
async fn read_into(
&mut self,
buffer: &mut [u8],
cancellation: &Cancellation,
) -> OperationResult<usize> {
SocketStreamReader::read_into(self, buffer, cancellation).await
}
async fn close(&mut self) -> io::Result<()> {
SocketStreamReader::close(self).await
}
}
impl<W: SocketStreamWriter> WritableStream for W {
async fn write(
&mut self,
buffer: &[u8],
cancellation: &Cancellation,
) -> OperationResult<usize> {
SocketStreamWriter::write(self, buffer, cancellation).await
}
async fn flush(&mut self, cancellation: &Cancellation) -> OperationResult<()> {
SocketStreamWriter::flush(self, cancellation).await
}
async fn close(&mut self) -> io::Result<()> {
SocketStreamWriter::close(self).await
}
}