1#[repr(u8)]
9#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)]
10pub enum ErrorClass {
11 Transport = 0x01,
13 Crypto = 0x02,
15 State = 0x03,
17 Policy = 0x04,
19 Schema = 0x05,
21 Authz = 0x06,
23}
24
25impl TryFrom<u8> for ErrorClass {
26 type Error = u8;
27 fn try_from(v: u8) -> Result<Self, u8> {
28 use ErrorClass::*;
29 Ok(match v {
30 0x01 => Transport,
31 0x02 => Crypto,
32 0x03 => State,
33 0x04 => Policy,
34 0x05 => Schema,
35 0x06 => Authz,
36 other => return Err(other),
37 })
38 }
39}
40
41pub mod codes {
50 pub const UNSUPPORTED_VERSION: u16 = 0x0001;
52 pub const UNKNOWN_GROUP: u16 = 0x0002;
54 pub const EPOCH_MISMATCH: u16 = 0x0003;
56 pub const TRANSITION_MISMATCH: u16 = 0x0004;
58 pub const REPLAY_DETECTED: u16 = 0x0005;
60 pub const DECRYPT_FAILED: u16 = 0x0006;
62 pub const COMMIT_INVALID: u16 = 0x0007;
64 pub const STREAM_POLICY_VIOLATION: u16 = 0x0008;
66 pub const TRANSITION_IN_PROGRESS: u16 = 0x0009;
68 pub const PREPARE_TIMEOUT: u16 = 0x0010;
70 pub const READY_TIMEOUT: u16 = 0x0011;
72 pub const EXECUTE_TIMEOUT: u16 = 0x0012;
74 pub const COORDINATOR_GONE: u16 = 0x0013;
76 pub const DIGEST_MISMATCH: u16 = 0x0014;
78
79 pub const GAP_BAD_SOURCE_ID: u16 = 0x1001;
81 pub const GAP_DECODE_FAILED: u16 = 0x1002;
83 pub const GAP_AUTH_FAILED: u16 = 0x1003;
85 pub const GAP_REPLAY_DETECTED: u16 = 0x1004;
87 pub const GAP_EPOCH_STALE: u16 = 0x1005;
89 pub const GAP_KEY_PHASE_UNKNOWN: u16 = 0x1006;
91
92 pub const GTP_BAD_LENGTH: u16 = 0x2001;
94 pub const GTP_UNSUPPORTED_CONTENT_TYPE: u16 = 0x2002;
96 pub const GTP_DUPLICATE_MESSAGE: u16 = 0x2003;
98 pub const GTP_POLICY_REJECTED: u16 = 0x2004;
100 pub const GTP_ATTACHMENT_INTEGRITY: u16 = 0x2005;
102 pub const GTP_REQUEST_TIMEOUT: u16 = 0x2006;
104
105 pub const GSP_BAD_SCHEMA: u16 = 0x3001;
107 pub const GSP_UNAUTHORIZED: u16 = 0x3002;
109 pub const GSP_UNKNOWN_SIGNAL: u16 = 0x3003;
111 pub const GSP_DUPLICATE_REQUEST: u16 = 0x3004;
113 pub const GSP_STATE_CONFLICT: u16 = 0x3005;
115 pub const GSP_PRECONDITION_FAILED: u16 = 0x3006;
117}
118
119#[derive(Copy, Clone, Debug)]
124pub struct ErrorSpec {
125 pub code: u16,
127 pub class: ErrorClass,
129 pub retryable: bool,
131 pub fatal: bool,
133 pub name: &'static str,
135}
136
137impl ErrorSpec {
138 pub fn lookup(code: u16) -> Option<ErrorSpec> {
140 use codes::*;
141 Some(match code {
142 UNSUPPORTED_VERSION => spec(code, ErrorClass::Schema, false, true, "ERR_UNSUPPORTED_VERSION"),
143 UNKNOWN_GROUP => spec(code, ErrorClass::State, false, true, "ERR_UNKNOWN_GROUP"),
144 EPOCH_MISMATCH => spec(code, ErrorClass::State, true, false, "ERR_EPOCH_MISMATCH"),
145 TRANSITION_MISMATCH => spec(code, ErrorClass::State, true, false, "ERR_TRANSITION_MISMATCH"),
146 REPLAY_DETECTED => spec(code, ErrorClass::Crypto, false, false, "ERR_REPLAY_DETECTED"),
147 DECRYPT_FAILED => spec(code, ErrorClass::Crypto, true, false, "ERR_DECRYPT_FAILED"),
148 COMMIT_INVALID => spec(code, ErrorClass::Crypto, false, true, "ERR_COMMIT_INVALID"),
149 STREAM_POLICY_VIOLATION => spec(code, ErrorClass::Policy, false, false, "ERR_STREAM_POLICY_VIOLATION"),
150 TRANSITION_IN_PROGRESS => spec(code, ErrorClass::State, false, false, "ERR_TRANSITION_IN_PROGRESS"),
151 PREPARE_TIMEOUT => spec(code, ErrorClass::State, true, false, "ERR_PREPARE_TIMEOUT"),
152 READY_TIMEOUT => spec(code, ErrorClass::State, true, false, "ERR_READY_TIMEOUT"),
153 EXECUTE_TIMEOUT => spec(code, ErrorClass::State, true, false, "ERR_EXECUTE_TIMEOUT"),
154 COORDINATOR_GONE => spec(code, ErrorClass::State, true, false, "ERR_COORDINATOR_GONE"),
155 DIGEST_MISMATCH => spec(code, ErrorClass::State, false, true, "ERR_DIGEST_MISMATCH"),
156 GAP_BAD_SOURCE_ID => spec(code, ErrorClass::Schema, false, false, "ERR_GAP_BAD_SOURCE_ID"),
157 GAP_DECODE_FAILED => spec(code, ErrorClass::Schema, false, false, "ERR_GAP_DECODE_FAILED"),
158 GAP_AUTH_FAILED => spec(code, ErrorClass::Crypto, false, false, "ERR_GAP_AUTH_FAILED"),
159 GAP_REPLAY_DETECTED => spec(code, ErrorClass::Crypto, false, false, "ERR_GAP_REPLAY_DETECTED"),
160 GAP_EPOCH_STALE => spec(code, ErrorClass::Crypto, false, false, "ERR_GAP_EPOCH_STALE"),
161 GAP_KEY_PHASE_UNKNOWN => spec(code, ErrorClass::Crypto, false, false, "ERR_GAP_KEY_PHASE_UNKNOWN"),
162 GTP_BAD_LENGTH => spec(code, ErrorClass::Schema, false, false, "ERR_GTP_BAD_LENGTH"),
163 GTP_UNSUPPORTED_CONTENT_TYPE => spec(code, ErrorClass::Schema, false, false, "ERR_GTP_UNSUPPORTED_CONTENT_TYPE"),
164 GTP_DUPLICATE_MESSAGE => spec(code, ErrorClass::Policy, false, false, "ERR_GTP_DUPLICATE_MESSAGE"),
165 GTP_POLICY_REJECTED => spec(code, ErrorClass::Policy, false, false, "ERR_GTP_POLICY_REJECTED"),
166 GTP_ATTACHMENT_INTEGRITY => spec(code, ErrorClass::Schema, false, false, "ERR_GTP_ATTACHMENT_INTEGRITY"),
167 GTP_REQUEST_TIMEOUT => spec(code, ErrorClass::State, true, false, "ERR_GTP_REQUEST_TIMEOUT"),
168 GSP_BAD_SCHEMA => spec(code, ErrorClass::Schema, false, false, "ERR_GSP_BAD_SCHEMA"),
169 GSP_UNAUTHORIZED => spec(code, ErrorClass::Authz, false, false, "ERR_GSP_UNAUTHORIZED"),
170 GSP_UNKNOWN_SIGNAL => spec(code, ErrorClass::Schema, false, false, "ERR_GSP_UNKNOWN_SIGNAL"),
171 GSP_DUPLICATE_REQUEST => spec(code, ErrorClass::Policy, false, false, "ERR_GSP_DUPLICATE_REQUEST"),
172 GSP_STATE_CONFLICT => spec(code, ErrorClass::State, true, false, "ERR_GSP_STATE_CONFLICT"),
173 GSP_PRECONDITION_FAILED => spec(code, ErrorClass::State, false, false, "ERR_GSP_PRECONDITION_FAILED"),
174 _ => return None,
175 })
176 }
177}
178
179const fn spec(code: u16, class: ErrorClass, retryable: bool, fatal: bool, name: &'static str) -> ErrorSpec {
180 ErrorSpec { code, class, retryable, fatal, name }
181}