1#[non_exhaustive]
20#[derive(Debug, Clone, Copy, PartialEq, Eq)]
21pub enum Error {
22 NotRegistered,
24 InvalidParam,
26 NoMemory,
28 Timeout,
30 NotSupported,
32 QueueFull,
34 MlFailed,
36 NetRefused,
38 NetUnreachable,
40 NetAddrInUse,
42 NetReset,
44 NetDnsFail,
46 NetClosed,
48 BusNack,
50 BusBusy,
52 BusError,
54 QueueEmpty,
56 WouldBlock,
58 Eof,
60 Inval,
62 NotFound,
64 Unknown(i32),
66}
67
68pub type Result<T> = core::result::Result<T, Error>;
70
71impl Error {
72 #[inline]
76 pub fn from_code(code: i32) -> Result<()> {
77 match code {
78 0 => Ok(()),
79 -1 => Err(Error::NotRegistered),
80 -2 => Err(Error::InvalidParam),
81 -3 => Err(Error::NoMemory),
82 -4 => Err(Error::Timeout),
83 -5 => Err(Error::NotSupported),
84 -6 => Err(Error::QueueFull),
85 -7 => Err(Error::MlFailed),
86 -8 => Err(Error::NetRefused),
87 -9 => Err(Error::NetUnreachable),
88 -10 => Err(Error::NetAddrInUse),
89 -11 => Err(Error::NetReset),
90 -12 => Err(Error::NetDnsFail),
91 -13 => Err(Error::NetClosed),
92 -14 => Err(Error::BusNack),
93 -15 => Err(Error::BusBusy),
94 -16 => Err(Error::BusError),
95 -17 => Err(Error::QueueEmpty),
96 -18 => Err(Error::WouldBlock),
97 -19 => Err(Error::Eof),
98 -20 => Err(Error::Inval),
99 -21 => Err(Error::NotFound),
100 other => Err(Error::Unknown(other)),
101 }
102 }
103
104 #[inline]
106 pub fn to_code(self) -> i32 {
107 match self {
108 Error::NotRegistered => -1,
109 Error::InvalidParam => -2,
110 Error::NoMemory => -3,
111 Error::Timeout => -4,
112 Error::NotSupported => -5,
113 Error::QueueFull => -6,
114 Error::MlFailed => -7,
115 Error::NetRefused => -8,
116 Error::NetUnreachable => -9,
117 Error::NetAddrInUse => -10,
118 Error::NetReset => -11,
119 Error::NetDnsFail => -12,
120 Error::NetClosed => -13,
121 Error::BusNack => -14,
122 Error::BusBusy => -15,
123 Error::BusError => -16,
124 Error::QueueEmpty => -17,
125 Error::WouldBlock => -18,
126 Error::Eof => -19,
127 Error::Inval => -20,
128 Error::NotFound => -21,
129 Error::Unknown(c) => c,
130 }
131 }
132
133 #[inline]
135 pub fn is_net_error(&self) -> bool {
136 matches!(
137 self,
138 Error::NetRefused
139 | Error::NetUnreachable
140 | Error::NetAddrInUse
141 | Error::NetReset
142 | Error::NetDnsFail
143 | Error::NetClosed
144 )
145 }
146
147 #[inline]
149 pub fn is_bus_error(&self) -> bool {
150 matches!(self, Error::BusNack | Error::BusBusy | Error::BusError)
151 }
152}
153
154#[cfg(not(docsrs))]
159const fn _assert_codes_match() {
160 use crate::bindings;
161 assert!(bindings::OVE_ERR_NOT_REGISTERED == -1);
162 assert!(bindings::OVE_ERR_INVALID_PARAM == -2);
163 assert!(bindings::OVE_ERR_NO_MEMORY == -3);
164 assert!(bindings::OVE_ERR_TIMEOUT == -4);
165 assert!(bindings::OVE_ERR_NOT_SUPPORTED == -5);
166 assert!(bindings::OVE_ERR_QUEUE_FULL == -6);
167 assert!(bindings::OVE_ERR_ML_FAILED == -7);
168 assert!(bindings::OVE_ERR_NET_REFUSED == -8);
169 assert!(bindings::OVE_ERR_NET_UNREACHABLE == -9);
170 assert!(bindings::OVE_ERR_NET_ADDR_IN_USE == -10);
171 assert!(bindings::OVE_ERR_NET_RESET == -11);
172 assert!(bindings::OVE_ERR_NET_DNS_FAIL == -12);
173 assert!(bindings::OVE_ERR_NET_CLOSED == -13);
174 assert!(bindings::OVE_ERR_BUS_NACK == -14);
175 assert!(bindings::OVE_ERR_BUS_BUSY == -15);
176 assert!(bindings::OVE_ERR_BUS_ERROR == -16);
177 assert!(bindings::OVE_ERR_QUEUE_EMPTY == -17);
178 assert!(bindings::OVE_ERR_WOULD_BLOCK == -18);
179 assert!(bindings::OVE_ERR_EOF == -19);
180 assert!(bindings::OVE_ERR_INVAL == -20);
181 assert!(bindings::OVE_ERR_NOT_FOUND == -21);
182}
183
184#[cfg(not(docsrs))]
185#[allow(clippy::used_underscore_items)] const _: () = _assert_codes_match();
187
188impl core::error::Error for Error {}
195
196impl core::fmt::Display for Error {
197 fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
198 match self {
199 Error::NotRegistered => write!(f, "not registered"),
200 Error::InvalidParam => write!(f, "invalid parameter"),
201 Error::NoMemory => write!(f, "out of memory"),
202 Error::Timeout => write!(f, "timeout"),
203 Error::NotSupported => write!(f, "not supported"),
204 Error::QueueFull => write!(f, "queue full"),
205 Error::MlFailed => write!(f, "ML inference failed"),
206 Error::NetRefused => write!(f, "connection refused"),
207 Error::NetUnreachable => write!(f, "network unreachable"),
208 Error::NetAddrInUse => write!(f, "address in use"),
209 Error::NetReset => write!(f, "connection reset"),
210 Error::NetDnsFail => write!(f, "DNS resolution failed"),
211 Error::NetClosed => write!(f, "connection closed"),
212 Error::BusNack => write!(f, "bus NACK"),
213 Error::BusBusy => write!(f, "bus busy"),
214 Error::BusError => write!(f, "bus error"),
215 Error::QueueEmpty => write!(f, "queue empty"),
216 Error::WouldBlock => write!(f, "would block"),
217 Error::Eof => write!(f, "end of file"),
218 Error::Inval => write!(f, "invalid argument"),
219 Error::NotFound => write!(f, "not found"),
220 Error::Unknown(c) => write!(f, "unknown error ({c})"),
221 }
222 }
223}
224
225#[cfg(test)]
226mod tests {
227 use super::*;
228
229 const KNOWN: &[(i32, Error)] = &[
230 (-1, Error::NotRegistered),
231 (-2, Error::InvalidParam),
232 (-3, Error::NoMemory),
233 (-4, Error::Timeout),
234 (-5, Error::NotSupported),
235 (-6, Error::QueueFull),
236 (-7, Error::MlFailed),
237 (-8, Error::NetRefused),
238 (-9, Error::NetUnreachable),
239 (-10, Error::NetAddrInUse),
240 (-11, Error::NetReset),
241 (-12, Error::NetDnsFail),
242 (-13, Error::NetClosed),
243 (-14, Error::BusNack),
244 (-15, Error::BusBusy),
245 (-16, Error::BusError),
246 (-17, Error::QueueEmpty),
247 (-18, Error::WouldBlock),
248 (-19, Error::Eof),
249 (-20, Error::Inval),
250 (-21, Error::NotFound),
251 ];
252
253 #[test]
254 fn from_code_zero_is_ok() {
255 assert_eq!(Error::from_code(0), Ok(()));
256 }
257
258 #[test]
259 fn from_code_known_codes_round_trip_through_to_code() {
260 for &(code, expected) in KNOWN {
261 assert_eq!(Error::from_code(code), Err(expected));
262 assert_eq!(expected.to_code(), code);
263 }
264 }
265
266 #[test]
267 fn from_code_unknown_preserves_raw_code() {
268 assert_eq!(Error::from_code(-999), Err(Error::Unknown(-999)));
269 assert_eq!(Error::Unknown(-999).to_code(), -999);
270 assert_eq!(Error::from_code(7), Err(Error::Unknown(7)));
274 }
275
276 #[test]
277 fn classifier_predicates() {
278 assert!(Error::NetRefused.is_net_error());
279 assert!(Error::NetClosed.is_net_error());
280 assert!(!Error::Timeout.is_net_error());
281 assert!(!Error::Unknown(-99).is_net_error());
282
283 assert!(Error::BusNack.is_bus_error());
284 assert!(Error::BusError.is_bus_error());
285 assert!(!Error::Timeout.is_bus_error());
286 assert!(!Error::NetRefused.is_bus_error());
287 }
288}