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(
143 code,
144 ErrorClass::Schema,
145 false,
146 true,
147 "ERR_UNSUPPORTED_VERSION",
148 ),
149 UNKNOWN_GROUP => spec(code, ErrorClass::State, false, true, "ERR_UNKNOWN_GROUP"),
150 EPOCH_MISMATCH => spec(code, ErrorClass::State, true, false, "ERR_EPOCH_MISMATCH"),
151 TRANSITION_MISMATCH => spec(
152 code,
153 ErrorClass::State,
154 true,
155 false,
156 "ERR_TRANSITION_MISMATCH",
157 ),
158 REPLAY_DETECTED => spec(
159 code,
160 ErrorClass::Crypto,
161 false,
162 false,
163 "ERR_REPLAY_DETECTED",
164 ),
165 DECRYPT_FAILED => spec(code, ErrorClass::Crypto, true, false, "ERR_DECRYPT_FAILED"),
166 COMMIT_INVALID => spec(code, ErrorClass::Crypto, false, true, "ERR_COMMIT_INVALID"),
167 STREAM_POLICY_VIOLATION => spec(
168 code,
169 ErrorClass::Policy,
170 false,
171 false,
172 "ERR_STREAM_POLICY_VIOLATION",
173 ),
174 TRANSITION_IN_PROGRESS => spec(
175 code,
176 ErrorClass::State,
177 false,
178 false,
179 "ERR_TRANSITION_IN_PROGRESS",
180 ),
181 PREPARE_TIMEOUT => spec(code, ErrorClass::State, true, false, "ERR_PREPARE_TIMEOUT"),
182 READY_TIMEOUT => spec(code, ErrorClass::State, true, false, "ERR_READY_TIMEOUT"),
183 EXECUTE_TIMEOUT => spec(code, ErrorClass::State, true, false, "ERR_EXECUTE_TIMEOUT"),
184 COORDINATOR_GONE => spec(code, ErrorClass::State, true, false, "ERR_COORDINATOR_GONE"),
185 DIGEST_MISMATCH => spec(code, ErrorClass::State, false, true, "ERR_DIGEST_MISMATCH"),
186 GAP_BAD_SOURCE_ID => spec(
187 code,
188 ErrorClass::Schema,
189 false,
190 false,
191 "ERR_GAP_BAD_SOURCE_ID",
192 ),
193 GAP_DECODE_FAILED => spec(
194 code,
195 ErrorClass::Schema,
196 false,
197 false,
198 "ERR_GAP_DECODE_FAILED",
199 ),
200 GAP_AUTH_FAILED => spec(
201 code,
202 ErrorClass::Crypto,
203 false,
204 false,
205 "ERR_GAP_AUTH_FAILED",
206 ),
207 GAP_REPLAY_DETECTED => spec(
208 code,
209 ErrorClass::Crypto,
210 false,
211 false,
212 "ERR_GAP_REPLAY_DETECTED",
213 ),
214 GAP_EPOCH_STALE => spec(
215 code,
216 ErrorClass::Crypto,
217 false,
218 false,
219 "ERR_GAP_EPOCH_STALE",
220 ),
221 GAP_KEY_PHASE_UNKNOWN => spec(
222 code,
223 ErrorClass::Crypto,
224 false,
225 false,
226 "ERR_GAP_KEY_PHASE_UNKNOWN",
227 ),
228 GTP_BAD_LENGTH => spec(code, ErrorClass::Schema, false, false, "ERR_GTP_BAD_LENGTH"),
229 GTP_UNSUPPORTED_CONTENT_TYPE => spec(
230 code,
231 ErrorClass::Schema,
232 false,
233 false,
234 "ERR_GTP_UNSUPPORTED_CONTENT_TYPE",
235 ),
236 GTP_DUPLICATE_MESSAGE => spec(
237 code,
238 ErrorClass::Policy,
239 false,
240 false,
241 "ERR_GTP_DUPLICATE_MESSAGE",
242 ),
243 GTP_POLICY_REJECTED => spec(
244 code,
245 ErrorClass::Policy,
246 false,
247 false,
248 "ERR_GTP_POLICY_REJECTED",
249 ),
250 GTP_ATTACHMENT_INTEGRITY => spec(
251 code,
252 ErrorClass::Schema,
253 false,
254 false,
255 "ERR_GTP_ATTACHMENT_INTEGRITY",
256 ),
257 GTP_REQUEST_TIMEOUT => spec(
258 code,
259 ErrorClass::State,
260 true,
261 false,
262 "ERR_GTP_REQUEST_TIMEOUT",
263 ),
264 GSP_BAD_SCHEMA => spec(code, ErrorClass::Schema, false, false, "ERR_GSP_BAD_SCHEMA"),
265 GSP_UNAUTHORIZED => spec(
266 code,
267 ErrorClass::Authz,
268 false,
269 false,
270 "ERR_GSP_UNAUTHORIZED",
271 ),
272 GSP_UNKNOWN_SIGNAL => spec(
273 code,
274 ErrorClass::Schema,
275 false,
276 false,
277 "ERR_GSP_UNKNOWN_SIGNAL",
278 ),
279 GSP_DUPLICATE_REQUEST => spec(
280 code,
281 ErrorClass::Policy,
282 false,
283 false,
284 "ERR_GSP_DUPLICATE_REQUEST",
285 ),
286 GSP_STATE_CONFLICT => spec(
287 code,
288 ErrorClass::State,
289 true,
290 false,
291 "ERR_GSP_STATE_CONFLICT",
292 ),
293 GSP_PRECONDITION_FAILED => spec(
294 code,
295 ErrorClass::State,
296 false,
297 false,
298 "ERR_GSP_PRECONDITION_FAILED",
299 ),
300 _ => return None,
301 })
302 }
303}
304
305const fn spec(
306 code: u16,
307 class: ErrorClass,
308 retryable: bool,
309 fatal: bool,
310 name: &'static str,
311) -> ErrorSpec {
312 ErrorSpec {
313 code,
314 class,
315 retryable,
316 fatal,
317 name,
318 }
319}