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
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
use crate::prelude::*;
pub type Result<T> = std::result::Result<T, Error>;
#[derive(Debug)]
pub struct Error {
repr: Repr,
}
impl Error {
#[must_use]
pub fn kind(&self) -> ErrorKind {
match &self.repr {
Repr::Inner(k) => k.clone(),
_ => ErrorKind::Other,
}
}
pub(crate) fn new<E>(error: E) -> Self
where
E: Into<Box<dyn error::Error + Send + Sync>>,
{
Self {
repr: Repr::Other(error.into()),
}
}
pub(crate) fn is(&self, othr_kind: &ErrorKind) -> bool {
if let Repr::Inner(kind) = &self.repr {
kind == othr_kind
} else {
false
}
}
}
impl error::Error for Error {
#[must_use]
fn source(&self) -> Option<&(dyn error::Error + 'static)> {
match &self.repr {
Repr::Inner(_) => None,
Repr::Other(src) => Some(src.as_ref()),
}
}
}
impl Display for Error {
fn fmt(&self, f: &mut Formatter<'_>) -> FmtResult {
Debug::fmt(&self.repr, f)
}
}
impl From<ErrorKind> for Error {
#[must_use]
fn from(kind: ErrorKind) -> Self {
Self {
repr: Repr::Inner(kind),
}
}
}
impl From<IOError> for Error {
#[must_use]
fn from(e: IOError) -> Self {
ErrorKind::IO(e.to_string()).into()
}
}
impl From<Box<bincode::ErrorKind>> for Error {
#[must_use]
fn from(e: Box<bincode::ErrorKind>) -> Self {
ErrorKind::Bincode(e.to_string()).into()
}
}
impl From<TryFromIntError> for Error {
#[must_use]
fn from(e: TryFromIntError) -> Self {
ErrorKind::Conversion(e.to_string()).into()
}
}
#[derive(Debug)]
enum Repr {
Inner(Kind),
Other(Box<dyn error::Error + 'static + Send + Sync>),
}
#[derive(Debug, Clone, PartialEq)]
pub enum Kind {
ActiveBlobNotSet,
WrongConfig,
Uninitialized,
RecordNotFound,
WorkDirInUse,
KeySizeMismatch,
RecordExists,
EmptyIndexBunch,
Index(String),
Bincode(String),
IO(String),
WrongFileNamePattern(PathBuf),
Conversion(String),
Other,
}