use byteorder::{ReadBytesExt, WriteBytesExt};
use std::io::{Read, Write};
use std::{ io};
use base::ModuleState;
use { PreliminaryTryFrom, WithFixedPayloadLength};
impl WithFixedPayloadLength for ModuleState {
const FIXED_PAYLOAD_LENGTH: u16 = u8::FIXED_PAYLOAD_LENGTH;
}
impl PreliminaryTryFrom<u8> for ModuleState {
type Error = io::Error;
fn try_from(value: u8) -> io::Result<Self> {
match value {
0 => Ok(ModuleState::Uninitialized),
1 => Ok(ModuleState::Ready),
2 => Ok(ModuleState::Running),
3 => Ok(ModuleState::Error),
_ => Err(io::Error::new(
io::ErrorKind::InvalidData,
format!("Invalid ModuleState enum value {}", value),
)),
}
}
}
pub(crate) trait ModuleStateWriterExt: Write {
fn write_module_state(&mut self, r: &ModuleState) -> io::Result<()> {
self.write_u8(r.clone() as u8)?;
Ok(())
}
}
impl<B: Write + ?Sized> ModuleStateWriterExt for B {}
pub(crate) trait ModuleStateReaderExt: Read {
fn read_module_state(&mut self) -> io::Result<ModuleState> {
let value = self.read_u8()?;
ModuleState::try_from(value)
}
}
impl<B: Read + ?Sized> ModuleStateReaderExt for B {}