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
126
127
128
use self::Kind::*;
use std::error;
use std::fmt;
#[derive(Debug)]
pub struct Error(Kind);
#[derive(Debug, Clone, Copy)]
#[repr(u8)]
enum Kind {
Shutdown = 1,
AtCapacity = 2,
Invalid = 3,
}
#[derive(Debug, PartialEq)]
pub struct Elapsed(());
#[derive(Debug)]
pub(crate) enum InsertError {
Elapsed,
Invalid,
}
impl Error {
pub fn shutdown() -> Error {
Error(Shutdown)
}
pub fn is_shutdown(&self) -> bool {
matches!(self.0, Kind::Shutdown)
}
pub fn at_capacity() -> Error {
Error(AtCapacity)
}
pub fn is_at_capacity(&self) -> bool {
matches!(self.0, Kind::AtCapacity)
}
pub fn invalid() -> Error {
Error(Invalid)
}
pub fn is_invalid(&self) -> bool {
matches!(self.0, Kind::Invalid)
}
pub(crate) fn as_u8(&self) -> u8 {
self.0 as u8
}
pub(crate) fn from_u8(n: u8) -> Self {
Error(match n {
1 => Shutdown,
2 => AtCapacity,
3 => Invalid,
_ => panic!("u8 does not correspond to any time error variant"),
})
}
}
impl error::Error for Error {}
impl fmt::Display for Error {
fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
use self::Kind::*;
let descr = match self.0 {
Shutdown => "the timer is shutdown, must be called from the context of Tokio runtime",
AtCapacity => "timer is at capacity and cannot create a new entry",
Invalid => "timer duration exceeds maximum duration",
};
write!(fmt, "{}", descr)
}
}
impl Elapsed {
pub(crate) fn new() -> Self {
Elapsed(())
}
}
impl fmt::Display for Elapsed {
fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
"deadline has elapsed".fmt(fmt)
}
}
impl std::error::Error for Elapsed {}
impl From<Elapsed> for std::io::Error {
fn from(_err: Elapsed) -> std::io::Error {
std::io::ErrorKind::TimedOut.into()
}
}