Skip to main content

steeloxide/
error.rs

1#[derive(Debug)]
2pub enum KeyboardError {
3    ZoneOutOfRange,
4}
5
6impl std::fmt::Display for KeyboardError {
7    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
8        match self {
9            KeyboardError::ZoneOutOfRange => write!(f, "steeloxide::keyboard error, colouring out of range")
10        }
11    }
12}
13
14impl std::error::Error for KeyboardError {
15    fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
16        match self {
17            KeyboardError::ZoneOutOfRange => None,
18        }
19    }
20}
21
22#[derive(Debug)]
23pub enum MouseError {
24    InvalidPollingRate,
25    ZoneOutOfRange,
26}
27
28impl std::fmt::Display for MouseError {
29    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
30        match self {
31            MouseError::InvalidPollingRate => write!(f, "steeloxide::mouse error, polling rate out of range"),
32            MouseError::ZoneOutOfRange => write!(f, "steeloxide::mouse error, colouring out of range")
33        }
34    }
35}
36
37impl std::error::Error for MouseError {
38    fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
39        match self {
40            MouseError::InvalidPollingRate => None,
41            MouseError::ZoneOutOfRange => None,
42        }
43    }
44}
45
46#[derive(Debug)]
47pub enum DeviceError {
48    NotFound,
49    Mouse(MouseError),
50    Keyboard(KeyboardError),
51}
52
53impl std::fmt::Display for DeviceError {
54    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
55        match self {
56            DeviceError::NotFound => write!(f, "steeloxide device not found"),
57            DeviceError::Mouse(err) => write!(f, "{err}"),
58            DeviceError::Keyboard(err) => write!(f, "{err}")
59        }
60    }
61}
62
63impl std::error::Error for DeviceError {
64    fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
65        match self {
66            DeviceError::NotFound => None,
67            DeviceError::Mouse(err) => err.source(),
68            DeviceError::Keyboard(err) => err.source(),
69        }
70    }
71}
72
73
74#[derive(Debug)]
75pub enum Error {
76    IO(std::io::Error),
77    HidApi(hidapi::HidError),
78    DeviceError(DeviceError)
79}
80
81impl std::fmt::Display for Error {
82    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
83        match self {
84            Error::IO(err) => write!(f, "steeloxide I/O error: {err}"),
85            Error::HidApi(err) => write!(f, "steeloxide hidapi error: {err}"),
86            Error::DeviceError(err) => write!(f, "{err}")
87        }
88    }
89}
90
91impl std::error::Error for Error {
92    fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
93        match self {
94            Error::IO(err) => err.source(),
95            Error::HidApi(err) => err.source(),
96            Error::DeviceError(err) => err.source()
97        }
98    }
99}
100
101impl From<std::io::Error> for Error {
102    fn from(value: std::io::Error) -> Self {
103        Self::IO(value)
104    }
105}
106
107impl From<hidapi::HidError> for Error {
108    fn from(value: hidapi::HidError) -> Self {
109        Self::HidApi(value)
110    }
111}
112
113impl From<MouseError> for Error {
114    fn from(value: MouseError) -> Self {
115        Self::DeviceError(DeviceError::Mouse(value))
116    }
117}
118
119impl From<DeviceError> for Error {
120    fn from(value: DeviceError) -> Self {
121        Self::DeviceError(value)
122    }
123}
124
125pub type Result<T> = std::result::Result<T, Error>;