driver_interface/io/mod.rs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
use core::fmt;
use alloc::boxed::Box;
pub type IOError = embedded_io::ErrorKind;
pub type IOResult<T = ()> = Result<T, IOError>;
pub type BoxWrite = Box<dyn Write>;
pub trait Write: Send + Sync {
// Required methods
fn write(&mut self, buf: &[u8]) -> IOResult<usize>;
fn flush(&mut self) -> IOResult;
/// Write an entire buffer into this writer.
///
/// This function calls `write()` in a loop until exactly `buf.len()` bytes have
/// been written, blocking if needed.
///
/// If you are using [`WriteReady`] to avoid blocking, you should not use this function.
/// `WriteReady::write_ready()` returning true only guarantees the first call to `write()` will
/// not block, so this function may still block in subsequent calls.
///
/// This function will panic if `write()` returns `Ok(0)`.
fn write_all(&mut self, mut buf: &[u8]) -> IOResult {
while !buf.is_empty() {
match self.write(buf) {
Ok(0) => panic!("write() returned Ok(0)"),
Ok(n) => buf = &buf[n..],
Err(e) => return Err(e),
}
}
Ok(())
}
}
impl fmt::Write for dyn Write {
fn write_str(&mut self, s: &str) -> fmt::Result {
self.write_all(s.as_bytes()).map_err(|_| fmt::Error)
}
}