use std::fmt;
#[non_exhaustive]
#[derive(Debug)]
pub enum Error {
Io(std::io::Error),
Timeout,
NoResponse,
Fault { mode: u8, code: i8 },
InvalidResponse(String),
NotConnected,
DeviceNotFound(String),
Protocol(String),
}
impl fmt::Display for Error {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Error::Io(e) => write!(f, "I/O error: {}", e),
Error::Timeout => write!(f, "Timeout waiting for response"),
Error::NoResponse => write!(f, "No response from controller"),
Error::Fault { mode, code } => {
write!(f, "Controller fault: mode={}, code={}", mode, code)
}
Error::InvalidResponse(msg) => write!(f, "Invalid response: {}", msg),
Error::NotConnected => write!(f, "Transport not connected"),
Error::DeviceNotFound(dev) => write!(f, "Device not found: {}", dev),
Error::Protocol(msg) => write!(f, "Protocol error: {}", msg),
}
}
}
impl std::error::Error for Error {
fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
match self {
Error::Io(e) => Some(e),
_ => None,
}
}
}
impl From<std::io::Error> for Error {
fn from(err: std::io::Error) -> Self {
Error::Io(err)
}
}
pub type Result<T> = std::result::Result<T, Error>;