use hidapi::HidError;
use std::error;
use std::fmt::{self, Display, Formatter};
#[derive(Debug)]
#[non_exhaustive]
pub enum Error {
Hid(Box<HidError>),
InvalidMessage,
Checksum,
Timeout,
InvalidTimeout,
}
impl From<HidError> for Error {
fn from(err: HidError) -> Self {
Error::Hid(Box::new(err))
}
}
impl From<zg_co2::Error> for Error {
fn from(err: zg_co2::Error) -> Self {
match err {
zg_co2::Error::InvalidMessage => Error::InvalidMessage,
zg_co2::Error::Checksum => Error::Checksum,
_ => unreachable!(),
}
}
}
impl Display for Error {
fn fmt(&self, f: &mut Formatter) -> fmt::Result {
match self {
Error::InvalidMessage => write!(f, "invalid message"),
Error::Checksum => write!(f, "checksum error"),
Error::Hid(err) => err.fmt(f),
Error::Timeout => write!(f, "timeout"),
Error::InvalidTimeout => write!(f, "invalid timeout"),
}
}
}
impl error::Error for Error {
fn source(&self) -> Option<&(dyn error::Error + 'static)> {
match self {
Error::Hid(cause) => Some(cause.as_ref()),
_ => None,
}
}
}
#[cfg(test)]
mod tests {
#[test]
fn test_send() {
fn assert_send<T: Send>() {}
assert_send::<super::Error>();
}
#[test]
fn test_sync() {
fn assert_sync<T: Sync>() {}
assert_sync::<super::Error>();
}
}