use async_trait::async_trait;
use embedded_io_async::{ErrorType, Read, Write};
use super::stream_async::AsyncByteStream;
use super::TransportError;
pub struct EmbeddedIoAsyncTransport<I> {
inner: I,
}
impl<I> EmbeddedIoAsyncTransport<I> {
pub fn new(inner: I) -> Self {
Self { inner }
}
pub fn into_inner(self) -> I {
self.inner
}
}
#[async_trait(?Send)]
impl<I> AsyncByteStream for EmbeddedIoAsyncTransport<I>
where
I: Read + Write + ErrorType,
{
async fn read_async(&mut self, buf: &mut [u8]) -> Result<usize, TransportError> {
self.inner
.read(buf)
.await
.map_err(|_| TransportError::IoFailed("embedded-io-async read failed"))
}
async fn write_all_async(&mut self, data: &[u8]) -> Result<(), TransportError> {
let mut offset = 0usize;
while offset < data.len() {
let n = self
.inner
.write(&data[offset..])
.await
.map_err(|_| TransportError::IoFailed("embedded-io-async write failed"))?;
if n == 0 {
return Err(TransportError::IoFailed(
"embedded-io-async wrote zero bytes",
));
}
offset = offset.saturating_add(n);
}
self.inner
.flush()
.await
.map_err(|_| TransportError::IoFailed("embedded-io-async flush failed"))?;
Ok(())
}
}