ljmrs/ljm/
error.rs

1use std::fmt::Debug;
2
3use crate::LJMLibrary;
4
5/// Taken from: [LJM ErrorCodes](https://labjack.com/pages/support?doc=%2Fsoftware-driver%2Fljm-users-guide%2Ferror-codes%2F)
6///
7/// > Note:
8/// > We ignore the 0 value as NoError, as
9/// > we replace it with a rust Result type.
10#[derive(PartialOrd, PartialEq)]
11pub enum LJMErrorCode {
12    LJMWarning(i32),
13    // 200-399
14    LJMModbusError(i32),
15    // 1200-1216
16    LJMLibraryError(i32),
17    // 1220-1399
18    DeviceError(i32),
19    // 2000-2999
20    UserError(i32),
21    // 3900-3999
22    Unknown(i32), // For any values outside these ranges.
23}
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}