use core::fmt;
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum ProtocolError {
PacketTooShort,
InvalidHeader(u8),
LengthMismatch {
declared: usize,
actual: usize,
},
InvalidCrc {
expected: u16,
actual: u16,
},
DataTooLong(usize),
InvalidArgument(&'static str),
InvalidResponse(&'static str),
}
impl fmt::Display for ProtocolError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::PacketTooShort => write!(f, "packet too short"),
Self::InvalidHeader(h) => write!(f, "invalid header 0x{h:02X}"),
Self::LengthMismatch { declared, actual } => {
write!(f, "length mismatch: declared={declared}, actual={actual}")
}
Self::InvalidCrc { expected, actual } => {
write!(
f,
"invalid CRC: expected=0x{expected:04X}, actual=0x{actual:04X}"
)
}
Self::DataTooLong(n) => write!(f, "data length {n} exceeds 255 bytes"),
Self::InvalidArgument(msg) => write!(f, "invalid argument: {msg}"),
Self::InvalidResponse(msg) => write!(f, "invalid response: {msg}"),
}
}
}
impl std::error::Error for ProtocolError {}