-
Notifications
You must be signed in to change notification settings - Fork 3
/
cat.rs
101 lines (81 loc) · 2.71 KB
/
cat.rs
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
use uutils_args::{Arguments, Options};
#[derive(Default)]
enum NumberingMode {
#[default]
None,
NonEmpty,
All,
}
#[derive(Clone, Arguments)]
enum Arg {
#[arg("-A", "--show-all")]
ShowAll,
#[arg("-b", "--number-nonblank")]
NumberNonblank,
#[arg("-e")]
ShowNonPrintingEnds,
#[arg("-E")]
ShowEnds,
#[arg("-n", "--number")]
Number,
#[arg("-s", "--squeeze-blank")]
SqueezeBlank,
#[arg("-t")]
ShowNonPrintingTabs,
#[arg("-T", "--show-tabs")]
ShowTabs,
#[arg("-v", "--show-nonprinting")]
ShowNonPrinting,
}
#[derive(Default)]
struct Settings {
show_tabs: bool,
show_ends: bool,
show_nonprinting: bool,
number: NumberingMode,
squeeze_blank: bool,
}
impl Options<Arg> for Settings {
fn apply(&mut self, arg: Arg) {
match arg {
Arg::ShowAll => {
self.show_tabs = true;
self.show_ends = true;
self.show_nonprinting = true;
}
Arg::ShowNonPrintingEnds => {
self.show_nonprinting = true;
self.show_ends = true;
}
Arg::ShowNonPrintingTabs => {
self.show_tabs = true;
self.show_nonprinting = true;
}
Arg::ShowEnds => self.show_ends = true,
Arg::ShowTabs => self.show_tabs = true,
Arg::ShowNonPrinting => self.show_nonprinting = true,
Arg::Number => self.number = NumberingMode::All,
Arg::NumberNonblank => self.number = NumberingMode::NonEmpty,
Arg::SqueezeBlank => self.squeeze_blank = true,
}
}
}
#[test]
fn show() {
let (s, _) = Settings::default().parse(["cat", "-v"]).unwrap();
assert!(!s.show_ends && !s.show_tabs && s.show_nonprinting);
let (s, _) = Settings::default().parse(["cat", "-E"]).unwrap();
assert!(s.show_ends && !s.show_tabs && !s.show_nonprinting);
let (s, _) = Settings::default().parse(["cat", "-T"]).unwrap();
assert!(!s.show_ends && s.show_tabs && !s.show_nonprinting);
let (s, _) = Settings::default().parse(["cat", "-e"]).unwrap();
assert!(s.show_ends && !s.show_tabs && s.show_nonprinting);
let (s, _) = Settings::default().parse(["cat", "-t"]).unwrap();
assert!(!s.show_ends && s.show_tabs && s.show_nonprinting);
let (s, _) = Settings::default().parse(["cat", "-A"]).unwrap();
assert!(s.show_ends && s.show_tabs && s.show_nonprinting);
let (s, _) = Settings::default().parse(["cat", "-te"]).unwrap();
assert!(s.show_ends && s.show_tabs && s.show_nonprinting);
let (s, _) = Settings::default().parse(["cat", "-vET"]).unwrap();
assert!(s.show_ends && s.show_tabs && s.show_nonprinting);
}