use embedded_io::{ErrorType, Read, Write};
use super::blocking::BlockingStream;
use super::TransportError;
pub struct EmbeddedIoTransport<I> {
inner: I,
}
impl<I> EmbeddedIoTransport<I> {
pub fn new(inner: I) -> Self {
Self { inner }
}
pub fn into_inner(self) -> I {
self.inner
}
}
impl<I: Read + Write + ErrorType> BlockingStream for EmbeddedIoTransport<I> {
fn read(&mut self, buf: &mut [u8]) -> Result<usize, TransportError> {
self.inner
.read(buf)
.map_err(|_| TransportError::IoFailed("embedded-io read failed"))
}
fn write_all(&mut self, data: &[u8]) -> Result<(), TransportError> {
let mut offset = 0usize;
while offset < data.len() {
let n = self
.inner
.write(&data[offset..])
.map_err(|_| TransportError::IoFailed("embedded-io write failed"))?;
if n == 0 {
return Err(TransportError::IoFailed("embedded-io wrote zero bytes"));
}
offset = offset.saturating_add(n);
}
self.inner
.flush()
.map_err(|_| TransportError::IoFailed("embedded-io flush failed"))?;
Ok(())
}
}