use thiserror::Error;
#[derive(Error, Debug)]
pub enum Error<T> {
#[error(transparent)]
Transport(T),
#[error("data overflow error: {0}")]
InvalidFrameLength(usize),
#[error("frame error: {0}")]
Frame(#[from] FrameError),
#[error("frame parse error: {0}")]
FrameParse(#[from] FrameParseError),
#[error("register error: {0}")]
RegisterError(#[from] RegisterError),
#[error("no response")]
NoResponse,
}
#[derive(Error, Debug)]
pub enum FrameError {
#[error("non-sequential registers")]
NonSequentialRegisters,
#[error("Empty subframe")]
EmptySubFrame,
#[error("mixed read and write registers")]
MixedReadWrites,
}
#[derive(Error, Debug)]
pub enum FrameParseError {
#[error("invalid subframe register address: {0}")]
InvalidFrameRegister(u8),
#[error("unsupported subframe register: {0:?}")]
UnsupportedSubframeRegister(crate::registers::FrameRegisters),
#[error("error parsing data into register: {0}")]
RegisterError(#[from] RegisterError),
}
#[allow(missing_docs)]
#[derive(Error, Debug)]
pub enum RegisterError {
#[error("value too large")]
Overflow,
#[error("invalid data")]
InvalidData,
#[error("invalid address")]
InvalidAddress,
#[error("float as int")]
IntAsFloat,
#[error(transparent)]
IO(#[from] std::io::Error),
#[error("register has no mapping")]
NoMapping,
#[error("cannot write register with no data")]
NoData,
}