1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
#![feature(min_specialization)]
#[allow(unused_extern_crates)]
extern crate tikv_alloc;
#[macro_use]
extern crate lazy_static;
macro_rules! define_error_codes {
($prefix:literal,
$($name:ident => ($suffix:literal, $description:literal, $workaround:literal)),+
) => {
use crate::ErrorCode;
$(pub const $name: ErrorCode = ErrorCode {
code: concat!($prefix, $suffix),
description: $description,
workaround: $workaround,
};)+
lazy_static! {
pub static ref ALL_ERROR_CODES: Vec<ErrorCode> = vec![$($name,)+];
}
};
}
pub const UNKNOWN: ErrorCode = ErrorCode {
code: "KV:Unknown",
description: "",
workaround: "",
};
pub mod cloud;
pub mod codec;
pub mod coprocessor;
pub mod encryption;
pub mod engine;
pub mod pd;
pub mod raft;
pub mod raftstore;
pub mod sst_importer;
pub mod storage;
use std::fmt::{self, Display, Formatter};
#[derive(PartialEq, Eq, Debug, Clone, Copy)]
pub struct ErrorCode {
pub code: &'static str,
pub description: &'static str,
pub workaround: &'static str,
}
impl Display for ErrorCode {
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
write!(f, "{}", self.code)
}
}
pub trait ErrorCodeExt {
fn error_code(&self) -> ErrorCode;
}
#[cfg(test)]
mod tests {
#[test]
fn test_define_error_code() {
define_error_codes!(
"KV:Raftstore:",
ENTRY_TOO_LARGE => ("EntryTooLarge", "", ""),
NOT_LEADER => ("NotLeader", "", "")
);
assert_eq!(
ENTRY_TOO_LARGE,
ErrorCode {
code: "KV:Raftstore:EntryTooLarge",
description: "",
workaround: "",
}
);
assert_eq!(
NOT_LEADER,
ErrorCode {
code: "KV:Raftstore:NotLeader",
description: "",
workaround: "",
}
);
}
}