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
use std::cmp::PartialEq;
use std::io;
use super::*;
pub type CacheResult<T, Actual> = Result<T, Error<Actual>>;
#[derive(Debug)]
pub enum Error<Actual> {
CasFailed(Actual),
Unsupported(String),
ReportableBug(String),
Io(io::Error),
Corruption {
at: LogID,
},
}
use Error::*;
impl<A> PartialEq for Error<A>
where A: PartialEq
{
fn eq(&self, other: &Error<A>) -> bool {
match self {
&CasFailed(ref l) => {
if let &CasFailed(ref r) = other {
l == r
} else {
false
}
}
&Unsupported(ref l) => {
if let &Unsupported(ref r) = other {
l == r
} else {
false
}
}
&ReportableBug(ref l) => {
if let &ReportableBug(ref r) = other {
l == r
} else {
false
}
}
&Corruption {
at: l,
} => {
if let &Corruption {
at: r,
} = other
{
l == r
} else {
false
}
}
&Io(_) => false,
}
}
}
impl<T> From<io::Error> for Error<T> {
#[inline]
fn from(io_error: io::Error) -> Error<T> {
Error::Io(io_error)
}
}
impl<T> Error<T> {
pub fn danger_cast<Other>(self) -> Error<Other> {
match self {
CasFailed(_) => {
panic!(
"trying to cast CasFailed(()) into a different Error type"
)
}
Unsupported(s) => Unsupported(s),
ReportableBug(s) => ReportableBug(s),
Io(e) => Io(e),
Corruption {
at,
} => Corruption {
at,
},
}
}
pub fn cast<Other>(self) -> Error<Other>
where Other: From<T>
{
match self {
CasFailed(other) => CasFailed(other.into()),
Unsupported(s) => Unsupported(s),
ReportableBug(s) => ReportableBug(s),
Io(e) => Io(e),
Corruption {
at,
} => Corruption {
at,
},
}
}
}