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
use argh::FromArgValue;
#[derive(Debug, Clone, Copy)]
pub enum Table {
Dates,
Status,
RemoteAddresses,
Referers,
Paths,
Methods,
}
pub static DEFAULT_TABLES: &[Table] = &[
Table::Dates,
Table::Status,
Table::RemoteAddresses,
Table::Referers,
Table::Paths,
];
pub static ALL_TABLES: &[Table] = &[
Table::Dates,
Table::Methods,
Table::Status,
Table::RemoteAddresses,
Table::Referers,
Table::Paths,
];
#[derive(Debug, Clone)]
pub struct Tables(Vec<Table>);
impl Default for Tables {
fn default() -> Self {
Self (DEFAULT_TABLES.to_vec())
}
}
impl Tables {
fn all() -> Self {
Self (ALL_TABLES.to_vec())
}
}
impl IntoIterator for Tables {
type Item = Table;
type IntoIter = std::vec::IntoIter<Self::Item>;
fn into_iter(self) -> Self::IntoIter {
self.0.into_iter()
}
}
impl FromArgValue for Tables {
fn from_arg_value(value: &str) -> Result<Self, String> {
let value = value.to_lowercase();
if value == "all" || value == "a" {
return Ok(Self::all());
}
let mut v = Vec::new();
for s in value.split(',') {
if s.contains("date") {
v.push(Table::Dates);
} else if s.contains("stat") {
v.push(Table::Status);
} else if s.contains("addr") {
v.push(Table::RemoteAddresses);
} else if s.contains("ref") {
v.push(Table::Referers);
} else if s.contains("path") {
v.push(Table::Paths);
} else if s.contains("method") {
v.push(Table::Methods);
} else {
return Err(format!("Unrecognized table : {:?}", s));
}
}
Ok(Self(v))
}
}