1use std::fmt::Debug;
2
3use crate::LJMLibrary;
4
5#[derive(PartialOrd, PartialEq)]
11pub enum LJMErrorCode {
12 LJMWarning(i32),
13 LJMModbusError(i32),
15 LJMLibraryError(i32),
17 DeviceError(i32),
19 UserError(i32),
21 Unknown(i32), }
24
25impl From<&LJMErrorCode> for i32 {
26 fn from(value: &LJMErrorCode) -> Self {
27 match value {
28 LJMErrorCode::LJMWarning(error_code) => error_code + 200,
29 LJMErrorCode::LJMModbusError(error_code) => error_code + 1200,
30 LJMErrorCode::LJMLibraryError(error_code) => error_code + 1220,
31 LJMErrorCode::DeviceError(error_code) => error_code + 2000,
32 LJMErrorCode::UserError(error_code) => error_code + 3900,
33 LJMErrorCode::Unknown(error_code) => *error_code,
34 }
35 }
36}
37
38impl From<i32> for LJMErrorCode {
39 fn from(error_code: i32) -> Self {
40 match error_code {
41 200..=399 => LJMErrorCode::LJMWarning(error_code - 200),
42 1200..=1216 => LJMErrorCode::LJMModbusError(error_code - 1200),
43 1220..=1399 => LJMErrorCode::LJMLibraryError(error_code - 1220),
44 2000..=2999 => LJMErrorCode::DeviceError(error_code - 2000),
45 3900..=3999 => LJMErrorCode::UserError(error_code - 3900),
46 _ => LJMErrorCode::Unknown(error_code),
47 }
48 }
49}
50
51impl Debug for LJMErrorCode {
52 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
53 let code: i32 = self.into();
54
55 let name = match self {
56 LJMErrorCode::LJMWarning(_) => "LabJackWarning",
57 LJMErrorCode::LJMModbusError(_) => "ModbusError",
58 LJMErrorCode::LJMLibraryError(_) => "LibraryError",
59 LJMErrorCode::DeviceError(_) => "DeviceError",
60 LJMErrorCode::UserError(_) => "UserError",
61 LJMErrorCode::Unknown(_) => "UnknownError",
62 };
63
64 write!(f, "{}({})", name, code)
65 }
66}
67
68pub enum LJMError {
69 #[cfg(feature = "dynlink")]
70 StartupError(libloading::Error),
71 #[cfg(feature = "dynlink")]
72 LibloadingError(libloading::Error),
73
74 WrapperInvalid(LJMLibrary),
75 ErrorCode(LJMErrorCode, String),
76 LibraryError(String),
77
78 Uninitialized,
79 StreamNotStarted,
80 ScriptNotSet,
81 ScriptStillRunning,
82 BadState,
83 NoCoverage,
84
85 PoisonedLock,
86 CStringConversionFailed,
87}
88
89#[cfg(feature = "dynlink")]
90impl From<libloading::Error> for LJMError {
91 fn from(value: libloading::Error) -> Self {
92 LJMError::LibloadingError(value)
93 }
94}
95
96impl Debug for LJMError {
97 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
98 write!(
99 f,
100 "{}",
101 match self {
102 #[cfg(feature = "dynlink")]
103 LJMError::StartupError(error) => format!("StartupError::{:?}", error),
104 #[cfg(feature = "dynlink")]
105 LJMError::LibloadingError(error) => format!("LibraryLoadingError::{:?}", error),
106
107 LJMError::ErrorCode(error, value) => format!("LJMError::{:?} ({})", error, value),
108 LJMError::LibraryError(error) => format!("LibraryError::{:?}", error),
109 LJMError::WrapperInvalid(_) => "WrapperInvalidError".to_string(),
110 LJMError::BadState => "BadStateError".to_string(),
111 LJMError::NoCoverage => "NoCoverageError".to_string(),
112
113 LJMError::Uninitialized => "UninitializedError".to_string(),
114 LJMError::StreamNotStarted => "StreamNotStartedError".to_string(),
115 LJMError::ScriptStillRunning => "ScriptStillRunningError".to_string(),
116 LJMError::ScriptNotSet => "ScriptNotSetError".to_string(),
117 LJMError::PoisonedLock => "PoisonedLockError".to_string(),
118 LJMError::CStringConversionFailed => "CStringConversionFailed".to_string(),
119 }
120 )
121 }
122}