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#[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
204pub 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);