use embedded_io_async::ReadExactError;
use crate::error::{IoError, IoErrorKind};
use crate::io::{AsyncRead, AsyncWrite};
pub struct EmbeddedIoAsyncReader<R: embedded_io_async::Read> {
reader: R,
}
impl<R: embedded_io_async::Read> EmbeddedIoAsyncReader<R> {
#[inline(always)]
pub fn new(reader: R) -> Self {
Self { reader }
}
#[inline(always)]
pub fn extract(self) -> R {
self.reader
}
}
impl<R: embedded_io_async::Read> From<R> for EmbeddedIoAsyncReader<R> {
fn from(value: R) -> Self {
Self::new(value)
}
}
impl<R: embedded_io_async::Read> AsyncRead<IoError> for EmbeddedIoAsyncReader<R> {
#[inline(always)]
async fn read_exact<'a>(&'a mut self, buf: &'a mut [u8]) -> Result<(), IoError> {
self.reader.read_exact(buf).await.map_err(|err| match err {
ReadExactError::UnexpectedEof => IoError::from(IoErrorKind::UnexpectedEof),
ReadExactError::Other(err) => IoError::from_embedded_io_error(err),
})
}
}
pub struct EmbeddedIoAsyncWriter<W: embedded_io_async::Write> {
writer: W,
}
impl<W: embedded_io_async::Write> EmbeddedIoAsyncWriter<W> {
#[inline(always)]
pub fn new(writer: W) -> Self {
Self { writer }
}
#[inline(always)]
pub fn extract(self) -> W {
self.writer
}
}
impl<W: embedded_io_async::Write> AsyncWrite<IoError> for EmbeddedIoAsyncWriter<W> {
#[inline(always)]
async fn write_all<'a>(&'a mut self, buf: &'a [u8]) -> Result<(), IoError> {
self.writer
.write_all(buf)
.await
.map_err(IoError::from_embedded_io_error)
}
#[inline]
async fn flush(&mut self) -> Result<(), IoError> {
self.writer
.flush()
.await
.map_err(IoError::from_embedded_io_error)
}
}