i2c_tiny_usb/
error.rs

1#[derive(thiserror::Error, Debug, PartialEq, Eq)]
2pub enum Error {
3    #[error("USB error")]
4    Usb(#[from] rusb::Error),
5
6    #[error("no acknowledgement from the i2c device")]
7    Nack,
8}
9
10pub type Result<T> = std::result::Result<T, Error>;
11
12impl From<Error> for std::io::Error {
13    fn from(value: Error) -> Self {
14        use std::io::ErrorKind;
15        match value {
16            Error::Usb(rusb::Error::InvalidParam) => ErrorKind::InvalidInput.into(),
17            Error::Usb(rusb::Error::Access) => ErrorKind::PermissionDenied.into(),
18            Error::Usb(rusb::Error::NoDevice) => ErrorKind::ConnectionRefused.into(),
19            Error::Usb(rusb::Error::NotFound) => ErrorKind::Unsupported.into(),
20            Error::Usb(rusb::Error::Busy) => ErrorKind::ResourceBusy.into(),
21            Error::Usb(rusb::Error::Timeout) => ErrorKind::TimedOut.into(),
22            Error::Usb(rusb::Error::Pipe) => ErrorKind::BrokenPipe.into(),
23            Error::Usb(rusb::Error::Interrupted) => ErrorKind::Interrupted.into(),
24            Error::Usb(rusb::Error::NoMem) => ErrorKind::OutOfMemory.into(),
25            Error::Usb(rusb::Error::NotSupported) => ErrorKind::InvalidInput.into(),
26            Error::Usb(_) => ErrorKind::Other.into(),
27            Error::Nack => ErrorKind::NotConnected.into(),
28        }
29    }
30}
31
32impl From<std::io::Error> for Error {
33    fn from(value: std::io::Error) -> Self {
34        match value.kind() {
35            std::io::ErrorKind::InvalidInput => Error::Usb(rusb::Error::InvalidParam),
36            std::io::ErrorKind::PermissionDenied => Error::Usb(rusb::Error::Access),
37            std::io::ErrorKind::ConnectionRefused => Error::Usb(rusb::Error::NoDevice),
38            std::io::ErrorKind::Unsupported => Error::Usb(rusb::Error::NotFound),
39            std::io::ErrorKind::ResourceBusy => Error::Usb(rusb::Error::Busy),
40            std::io::ErrorKind::TimedOut => Error::Usb(rusb::Error::Timeout),
41            std::io::ErrorKind::BrokenPipe => Error::Usb(rusb::Error::Pipe),
42            std::io::ErrorKind::Interrupted => Error::Usb(rusb::Error::Interrupted),
43            std::io::ErrorKind::OutOfMemory => Error::Usb(rusb::Error::NoMem),
44            std::io::ErrorKind::NotConnected => Error::Nack,
45            _ => Error::Usb(rusb::Error::Other),
46        }
47    }
48}