/
basename.rs
88 lines (75 loc) · 2.11 KB
/
basename.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
use std::ffi::OsString;
use uutils_args::{
positional::{Many1, Unpack},
Arguments, Options,
};
#[derive(Clone, Arguments)]
enum Arg {
#[arg("-a", "--multiple")]
Multiple,
#[arg("-s SUFFIX", "--suffix=SUFFIX")]
Suffix(OsString),
#[arg("-z", "--zero")]
Zero,
}
#[derive(Default)]
struct Settings {
multiple: bool,
suffix: OsString,
zero: bool,
names: Vec<OsString>,
}
impl Options<Arg> for Settings {
fn apply(&mut self, arg: Arg) {
match arg {
Arg::Multiple => self.multiple = true,
Arg::Suffix(s) => {
self.multiple = true;
self.suffix = s
}
Arg::Zero => self.zero = true,
}
}
}
fn parse(args: &[&str]) -> Result<Settings, uutils_args::Error> {
let (mut settings, operands) = Settings::default().parse(args)?;
if settings.multiple {
let names = Many1("FILE").unpack(operands)?;
settings.names = names;
} else {
let (names, suffix) = ("FILE", "SUFFIX").unpack(operands)?;
settings.names = vec![names];
settings.suffix = suffix;
}
Ok(settings)
}
#[test]
fn name_and_suffix() {
let settings = parse(&["basename", "foobar", "bar"]).unwrap();
assert!(!settings.zero);
assert_eq!(settings.names, vec!["foobar"]);
assert_eq!(settings.suffix, "bar");
}
#[test]
fn zero_name_and_suffix() {
let settings = parse(&["basename", "-z", "foobar", "bar"]).unwrap();
assert!(settings.zero);
assert_eq!(settings.names, vec!["foobar"]);
assert_eq!(settings.suffix, "bar");
}
#[test]
fn all_and_names() {
let settings = parse(&["basename", "-a", "foobar", "bar"]).unwrap();
assert!(settings.multiple);
assert!(!settings.zero);
assert_eq!(settings.names, vec!["foobar", "bar"]);
assert_eq!(settings.suffix, "");
}
#[test]
fn option_like_names() {
let settings = parse(&["basename", "-a", "--", "-a", "-z", "--suffix=SUFFIX"]).unwrap();
assert!(settings.multiple);
assert!(!settings.zero);
assert_eq!(settings.names, vec!["-a", "-z", "--suffix=SUFFIX"]);
assert_eq!(settings.suffix, "");
}