epics_ca/
error.rs

1#[derive(Debug, Clone, Copy, Hash, PartialEq, Eq)]
2pub enum ErrorKind {
3    Allocmem,
4    Tolarge,
5    Timeout,
6    Badtype,
7    Internal,
8    Getfail,
9    Putfail,
10    Badcount,
11    Badstr,
12    Disconn,
13    Dblchnl,
14    Evdisallow,
15    Badmonid,
16    Badmask,
17    Badsyncgrp,
18    Putcbinprog,
19    Nordaccess,
20    Nowtaccess,
21    Anachronism,
22    Nosearchaddr,
23    Noconvert,
24    Badchid,
25    Badfuncptr,
26    Isattached,
27    Unavailinserv,
28    Chandestroy,
29    Badpriority,
30    Notthreaded,
31    N16karrayclient,
32    Connseqtmo,
33    Unresptmo,
34    Other(i32),
35}
36
37impl ErrorKind {
38    pub const fn from_raw_msg_no(msg_no: i32) -> Self {
39        if msg_no == sys::CA_EXTRACT_MSG_NO(sys::ECA_ALLOCMEM) {
40            Self::Allocmem
41        } else if msg_no == sys::CA_EXTRACT_MSG_NO(sys::ECA_TOLARGE) {
42            Self::Tolarge
43        } else if msg_no == sys::CA_EXTRACT_MSG_NO(sys::ECA_TIMEOUT) {
44            Self::Timeout
45        } else if msg_no == sys::CA_EXTRACT_MSG_NO(sys::ECA_BADTYPE) {
46            Self::Badtype
47        } else if msg_no == sys::CA_EXTRACT_MSG_NO(sys::ECA_INTERNAL) {
48            Self::Internal
49        } else if msg_no == sys::CA_EXTRACT_MSG_NO(sys::ECA_GETFAIL) {
50            Self::Getfail
51        } else if msg_no == sys::CA_EXTRACT_MSG_NO(sys::ECA_PUTFAIL) {
52            Self::Putfail
53        } else if msg_no == sys::CA_EXTRACT_MSG_NO(sys::ECA_BADCOUNT) {
54            Self::Badcount
55        } else if msg_no == sys::CA_EXTRACT_MSG_NO(sys::ECA_BADSTR) {
56            Self::Badstr
57        } else if msg_no == sys::CA_EXTRACT_MSG_NO(sys::ECA_DISCONN) {
58            Self::Disconn
59        } else if msg_no == sys::CA_EXTRACT_MSG_NO(sys::ECA_DBLCHNL) {
60            Self::Dblchnl
61        } else if msg_no == sys::CA_EXTRACT_MSG_NO(sys::ECA_EVDISALLOW) {
62            Self::Evdisallow
63        } else if msg_no == sys::CA_EXTRACT_MSG_NO(sys::ECA_BADMONID) {
64            Self::Badmonid
65        } else if msg_no == sys::CA_EXTRACT_MSG_NO(sys::ECA_BADMASK) {
66            Self::Badmask
67        } else if msg_no == sys::CA_EXTRACT_MSG_NO(sys::ECA_BADSYNCGRP) {
68            Self::Badsyncgrp
69        } else if msg_no == sys::CA_EXTRACT_MSG_NO(sys::ECA_PUTCBINPROG) {
70            Self::Putcbinprog
71        } else if msg_no == sys::CA_EXTRACT_MSG_NO(sys::ECA_NORDACCESS) {
72            Self::Nordaccess
73        } else if msg_no == sys::CA_EXTRACT_MSG_NO(sys::ECA_NOWTACCESS) {
74            Self::Nowtaccess
75        } else if msg_no == sys::CA_EXTRACT_MSG_NO(sys::ECA_ANACHRONISM) {
76            Self::Anachronism
77        } else if msg_no == sys::CA_EXTRACT_MSG_NO(sys::ECA_NOSEARCHADDR) {
78            Self::Nosearchaddr
79        } else if msg_no == sys::CA_EXTRACT_MSG_NO(sys::ECA_NOCONVERT) {
80            Self::Noconvert
81        } else if msg_no == sys::CA_EXTRACT_MSG_NO(sys::ECA_BADCHID) {
82            Self::Badchid
83        } else if msg_no == sys::CA_EXTRACT_MSG_NO(sys::ECA_BADFUNCPTR) {
84            Self::Badfuncptr
85        } else if msg_no == sys::CA_EXTRACT_MSG_NO(sys::ECA_ISATTACHED) {
86            Self::Isattached
87        } else if msg_no == sys::CA_EXTRACT_MSG_NO(sys::ECA_UNAVAILINSERV) {
88            Self::Unavailinserv
89        } else if msg_no == sys::CA_EXTRACT_MSG_NO(sys::ECA_CHANDESTROY) {
90            Self::Chandestroy
91        } else if msg_no == sys::CA_EXTRACT_MSG_NO(sys::ECA_BADPRIORITY) {
92            Self::Badpriority
93        } else if msg_no == sys::CA_EXTRACT_MSG_NO(sys::ECA_NOTTHREADED) {
94            Self::Notthreaded
95        } else if msg_no == sys::CA_EXTRACT_MSG_NO(sys::ECA_16KARRAYCLIENT) {
96            Self::N16karrayclient
97        } else if msg_no == sys::CA_EXTRACT_MSG_NO(sys::ECA_CONNSEQTMO) {
98            Self::Connseqtmo
99        } else if msg_no == sys::CA_EXTRACT_MSG_NO(sys::ECA_UNRESPTMO) {
100            Self::Unresptmo
101        } else {
102            Self::Other(msg_no)
103        }
104    }
105
106    pub const fn to_raw_msg_no(self) -> i32 {
107        match self {
108            Self::Allocmem => sys::CA_EXTRACT_MSG_NO(sys::ECA_ALLOCMEM),
109            Self::Tolarge => sys::CA_EXTRACT_MSG_NO(sys::ECA_TOLARGE),
110            Self::Timeout => sys::CA_EXTRACT_MSG_NO(sys::ECA_TIMEOUT),
111            Self::Badtype => sys::CA_EXTRACT_MSG_NO(sys::ECA_BADTYPE),
112            Self::Internal => sys::CA_EXTRACT_MSG_NO(sys::ECA_INTERNAL),
113            Self::Getfail => sys::CA_EXTRACT_MSG_NO(sys::ECA_GETFAIL),
114            Self::Putfail => sys::CA_EXTRACT_MSG_NO(sys::ECA_PUTFAIL),
115            Self::Badcount => sys::CA_EXTRACT_MSG_NO(sys::ECA_BADCOUNT),
116            Self::Badstr => sys::CA_EXTRACT_MSG_NO(sys::ECA_BADSTR),
117            Self::Disconn => sys::CA_EXTRACT_MSG_NO(sys::ECA_DISCONN),
118            Self::Dblchnl => sys::CA_EXTRACT_MSG_NO(sys::ECA_DBLCHNL),
119            Self::Evdisallow => sys::CA_EXTRACT_MSG_NO(sys::ECA_EVDISALLOW),
120            Self::Badmonid => sys::CA_EXTRACT_MSG_NO(sys::ECA_BADMONID),
121            Self::Badmask => sys::CA_EXTRACT_MSG_NO(sys::ECA_BADMASK),
122            Self::Badsyncgrp => sys::CA_EXTRACT_MSG_NO(sys::ECA_BADSYNCGRP),
123            Self::Putcbinprog => sys::CA_EXTRACT_MSG_NO(sys::ECA_PUTCBINPROG),
124            Self::Nordaccess => sys::CA_EXTRACT_MSG_NO(sys::ECA_NORDACCESS),
125            Self::Nowtaccess => sys::CA_EXTRACT_MSG_NO(sys::ECA_NOWTACCESS),
126            Self::Anachronism => sys::CA_EXTRACT_MSG_NO(sys::ECA_ANACHRONISM),
127            Self::Nosearchaddr => sys::CA_EXTRACT_MSG_NO(sys::ECA_NOSEARCHADDR),
128            Self::Noconvert => sys::CA_EXTRACT_MSG_NO(sys::ECA_NOCONVERT),
129            Self::Badchid => sys::CA_EXTRACT_MSG_NO(sys::ECA_BADCHID),
130            Self::Badfuncptr => sys::CA_EXTRACT_MSG_NO(sys::ECA_BADFUNCPTR),
131            Self::Isattached => sys::CA_EXTRACT_MSG_NO(sys::ECA_ISATTACHED),
132            Self::Unavailinserv => sys::CA_EXTRACT_MSG_NO(sys::ECA_UNAVAILINSERV),
133            Self::Chandestroy => sys::CA_EXTRACT_MSG_NO(sys::ECA_CHANDESTROY),
134            Self::Badpriority => sys::CA_EXTRACT_MSG_NO(sys::ECA_BADPRIORITY),
135            Self::Notthreaded => sys::CA_EXTRACT_MSG_NO(sys::ECA_NOTTHREADED),
136            Self::N16karrayclient => sys::CA_EXTRACT_MSG_NO(sys::ECA_16KARRAYCLIENT),
137            Self::Connseqtmo => sys::CA_EXTRACT_MSG_NO(sys::ECA_CONNSEQTMO),
138            Self::Unresptmo => sys::CA_EXTRACT_MSG_NO(sys::ECA_UNRESPTMO),
139            Self::Other(msg_no) => msg_no,
140        }
141    }
142}
143
144#[derive(Debug, Clone, Copy, Hash, PartialEq, Eq)]
145pub enum ErrorSeverity {
146    Error,
147    Warning,
148    Severe,
149    Fatal,
150    Unknown(i32),
151}
152
153impl ErrorSeverity {
154    pub const fn from_raw_severity(severity: i32) -> Self {
155        match severity {
156            sys::CA_K_ERROR => Self::Error,
157            sys::CA_K_WARNING => Self::Warning,
158            sys::CA_K_SEVERE => Self::Severe,
159            sys::CA_K_FATAL => Self::Fatal,
160            sev => Self::Unknown(sev),
161        }
162    }
163
164    pub const fn to_raw_severity(self) -> i32 {
165        match self {
166            Self::Error => sys::CA_K_ERROR,
167            Self::Warning => sys::CA_K_WARNING,
168            Self::Severe => sys::CA_K_SEVERE,
169            Self::Fatal => sys::CA_K_FATAL,
170            Self::Unknown(sev) => sev,
171        }
172    }
173}
174
175/// Error that can occur in EPICS client or server.
176#[derive(Debug, Clone, Copy)]
177pub struct Error {
178    pub kind: ErrorKind,
179    pub severity: ErrorSeverity,
180}
181
182impl Error {
183    pub const fn try_from_raw(eca: i32) -> Option<Self> {
184        if sys::CA_EXTRACT_SUCCESS(eca) != 0 {
185            None
186        } else {
187            Some(Self::from_raw_unchecked(eca))
188        }
189    }
190
191    const fn from_raw_unchecked(eca: i32) -> Self {
192        Error {
193            kind: ErrorKind::from_raw_msg_no(sys::CA_EXTRACT_MSG_NO(eca)),
194            severity: ErrorSeverity::from_raw_severity(sys::CA_EXTRACT_SEVERITY(eca)),
195        }
196    }
197
198    pub const fn into_raw(self) -> i32 {
199        sys::CA_INSERT_MSG_NO(self.kind.to_raw_msg_no())
200            | sys::CA_INSERT_SEVERITY(self.severity.to_raw_severity())
201    }
202}
203
204/// Convert raw EPICS error to Result.
205pub fn result_from_raw(eca: i32) -> Result<(), Error> {
206    match Error::try_from_raw(eca) {
207        None => Ok(()),
208        Some(err) => Err(err),
209    }
210}
211
212pub const ALLOCMEM: Error = Error::from_raw_unchecked(sys::ECA_ALLOCMEM);
213pub const TOLARGE: Error = Error::from_raw_unchecked(sys::ECA_TOLARGE);
214pub const TIMEOUT: Error = Error::from_raw_unchecked(sys::ECA_TIMEOUT);
215pub const BADTYPE: Error = Error::from_raw_unchecked(sys::ECA_BADTYPE);
216pub const INTERNAL: Error = Error::from_raw_unchecked(sys::ECA_INTERNAL);
217pub const GETFAIL: Error = Error::from_raw_unchecked(sys::ECA_GETFAIL);
218pub const PUTFAIL: Error = Error::from_raw_unchecked(sys::ECA_PUTFAIL);
219pub const BADCOUNT: Error = Error::from_raw_unchecked(sys::ECA_BADCOUNT);
220pub const BADSTR: Error = Error::from_raw_unchecked(sys::ECA_BADSTR);
221pub const DISCONN: Error = Error::from_raw_unchecked(sys::ECA_DISCONN);
222pub const DBLCHNL: Error = Error::from_raw_unchecked(sys::ECA_DBLCHNL);
223pub const EVDISALLOW: Error = Error::from_raw_unchecked(sys::ECA_EVDISALLOW);
224pub const BADMONID: Error = Error::from_raw_unchecked(sys::ECA_BADMONID);
225pub const BADMASK: Error = Error::from_raw_unchecked(sys::ECA_BADMASK);
226pub const BADSYNCGRP: Error = Error::from_raw_unchecked(sys::ECA_BADSYNCGRP);
227pub const PUTCBINPROG: Error = Error::from_raw_unchecked(sys::ECA_PUTCBINPROG);
228pub const NORDACCESS: Error = Error::from_raw_unchecked(sys::ECA_NORDACCESS);
229pub const NOWTACCESS: Error = Error::from_raw_unchecked(sys::ECA_NOWTACCESS);
230pub const ANACHRONISM: Error = Error::from_raw_unchecked(sys::ECA_ANACHRONISM);
231pub const NOSEARCHADDR: Error = Error::from_raw_unchecked(sys::ECA_NOSEARCHADDR);
232pub const NOCONVERT: Error = Error::from_raw_unchecked(sys::ECA_NOCONVERT);
233pub const BADCHID: Error = Error::from_raw_unchecked(sys::ECA_BADCHID);
234pub const BADFUNCPTR: Error = Error::from_raw_unchecked(sys::ECA_BADFUNCPTR);
235pub const ISATTACHED: Error = Error::from_raw_unchecked(sys::ECA_ISATTACHED);
236pub const UNAVAILINSERV: Error = Error::from_raw_unchecked(sys::ECA_UNAVAILINSERV);
237pub const CHANDESTROY: Error = Error::from_raw_unchecked(sys::ECA_CHANDESTROY);
238pub const BADPRIORITY: Error = Error::from_raw_unchecked(sys::ECA_BADPRIORITY);
239pub const NOTTHREADED: Error = Error::from_raw_unchecked(sys::ECA_NOTTHREADED);
240pub const N16KARRAYCLIENT: Error = Error::from_raw_unchecked(sys::ECA_16KARRAYCLIENT);
241pub const CONNSEQTMO: Error = Error::from_raw_unchecked(sys::ECA_CONNSEQTMO);
242pub const UNRESPTMO: Error = Error::from_raw_unchecked(sys::ECA_UNRESPTMO);