use avr_oxide::OxideResult::{Ok};
#[cfg_attr(not(target_arch="avr"), derive(Debug))]
#[cfg_attr(target_arch="avr", derive(ufmt::derive::uDebug))]
pub enum IoError {
EndOfFile,
NoFreeSpace,
Unknown,
WriteProhibited,
ReadProhibited,
DeviceNotReady,
OutOfRange,
Exists,
NotFound,
EndianMismatch,
Unformatted,
BadOptions
}
pub type Result<T> = avr_oxide::OxideResult<T,IoError>;
pub trait Read {
fn read(&mut self, _buf: &mut [u8]) -> avr_oxide::io::Result<usize>;
fn read_exact(&mut self, buf: &mut [u8]) -> avr_oxide::io::Result<()> {
let mut offset = 0usize;
while offset < buf.len() {
let bytes_read = self.read(&mut buf[offset..])?;
offset += bytes_read;
}
Ok(())
}
}
pub trait Write {
fn flush(&mut self) -> avr_oxide::io::Result<()>;
fn write_buffered(&mut self, buf:&[u8]) -> avr_oxide::io::Result<usize>;
fn write(&mut self, buf: &[u8]) -> avr_oxide::io::Result<usize> {
let bytes = self.write_buffered(buf)?;
self.flush()?;
Ok(bytes)
}
fn write_all(&mut self, buf: &[u8]) -> avr_oxide::io::Result<()> {
let mut offset = 0usize;
while offset < buf.len() {
let bytes_written = self.write_buffered(&buf[offset..])?;
offset += bytes_written;
}
self.flush()?;
Ok(())
}
}
#[cfg(not(target_arch="avr"))]
impl Read for std::io::Stdin {
fn read(&mut self, buf: &mut [u8]) -> avr_oxide::io::Result<usize> {
match std::io::Read::read(self, buf) {
std::result::Result::Ok(b) => avr_oxide::OxideResult::Ok(b),
std::result::Result::Err(_e) => avr_oxide::OxideResult::Err(IoError::Unknown)
}
}
}
#[cfg(not(target_arch="avr"))]
impl Write for std::io::Stdout {
fn write_buffered(&mut self, buf: &[u8]) -> avr_oxide::io::Result<usize> {
match std::io::Write::write(self, buf) {
std::result::Result::Ok(b) => avr_oxide::OxideResult::Ok(b),
std::result::Result::Err(_e) => avr_oxide::OxideResult::Err(IoError::Unknown)
}
}
fn flush(&mut self) -> Result<()> {
std::io::Write::flush(self);
avr_oxide::OxideResult::Ok(())
}
}
#[cfg(not(target_arch="avr"))]
impl Write for std::io::Stderr {
fn write_buffered(&mut self, buf: &[u8]) -> Result<usize> {
match std::io::Write::write(self, buf) {
std::result::Result::Ok(b) => avr_oxide::OxideResult::Ok(b),
std::result::Result::Err(_e) => avr_oxide::OxideResult::Err(IoError::Unknown)
}
}
fn flush(&mut self) -> Result<()> {
std::io::Write::flush(self);
avr_oxide::OxideResult::Ok(())
}
}