1use thiserror::Error;
2
3#[derive(Error, Debug)]
4pub enum CaError {
5 #[error("I/O error: {0}")]
6 Io(#[from] std::io::Error),
7
8 #[error("timeout waiting for response")]
9 Timeout,
10
11 #[error("channel not found: {0}")]
12 ChannelNotFound(String),
13
14 #[error("protocol error: {0}")]
15 Protocol(String),
16
17 #[error("unsupported DBR type: {0}")]
18 UnsupportedType(u16),
19
20 #[error("write failed: ECA status {0:#06x}")]
21 WriteFailed(u32),
22
23 #[error("field not found: {0}")]
24 FieldNotFound(String),
25
26 #[error("field is read-only: {0}")]
27 ReadOnlyField(String),
28
29 #[error("type mismatch for field {0}")]
30 TypeMismatch(String),
31
32 #[error("invalid value: {0}")]
33 InvalidValue(String),
34
35 #[error("put disabled (DISP=1) for field {0}")]
36 PutDisabled(String),
37
38 #[error("link error: {0}")]
39 LinkError(String),
40
41 #[error("DB parse error at line {line}, column {column}: {message}")]
42 DbParseError {
43 line: usize,
44 column: usize,
45 message: String,
46 },
47
48 #[error("calc error: {0}")]
49 CalcError(String),
50
51 #[error("channel disconnected")]
52 Disconnected,
53
54 #[error("client shut down")]
55 Shutdown,
56
57 #[error("put callback in progress for record {0}")]
61 PutCallbackInProgress(String),
62
63 #[error("server reported ECA status {0:#06x}")]
72 ServerError(u32),
73}
74
75const ECA_TIMEOUT: u32 = 80; const ECA_NOWTACCESS: u32 = 376; const ECA_PUTFAIL: u32 = 160; const ECA_BADTYPE: u32 = 114; const ECA_DISCONN: u32 = 192; const ECA_PUTCBINPROG: u32 = 366; impl CaError {
84 pub fn to_eca_status(&self) -> u32 {
85 match self {
86 CaError::Timeout => ECA_TIMEOUT,
87 CaError::ReadOnlyField(_) => ECA_NOWTACCESS,
88 CaError::PutDisabled(_) => ECA_PUTFAIL,
89 CaError::TypeMismatch(_) => ECA_BADTYPE,
90 CaError::UnsupportedType(_) => ECA_BADTYPE,
91 CaError::InvalidValue(_) => ECA_BADTYPE,
92 CaError::FieldNotFound(_) => ECA_PUTFAIL,
93 CaError::Disconnected | CaError::Shutdown => ECA_DISCONN,
99 CaError::Io(_) => ECA_DISCONN,
103 CaError::WriteFailed(code) => *code,
104 CaError::PutCallbackInProgress(_) => ECA_PUTCBINPROG,
105 CaError::ServerError(code) => *code,
106 _ => ECA_PUTFAIL,
107 }
108 }
109}
110
111pub type CaResult<T> = Result<T, CaError>;