1use jargon_args::Jargon;
2
3struct Args {
5 multiple: bool,
6 suffix: Option<String>,
7 zero: bool,
8 names: Vec<String>,
9}
10
11fn main() {
12 let mut j: Jargon = Jargon::from_env(); if j.contains(["-h", "--help"]) { print!("{}", HELP);
16 return;
17 }
18
19 if j.contains(["-v", "--version"]) { println!(
21 "basename example for Jargon crate {}",
22 env!("CARGO_PKG_VERSION")
23 );
24 return;
25 }
26
27 let args = Args { multiple: j.contains(["-a", "--multiple"]), suffix: j.option_arg(["-s", "--suffix"]), zero: j.contains(["-z", "--zero"]), names: j.finish(), };
33
34 if args.names.is_empty() { println!("Missing NAMES");
36 return;
37 }
38
39 let mut v: Vec<String> = vec![print(&args, &args.names[0])]; if args.multiple { args.names.iter().skip(1).for_each(|name| v.append(&mut vec![print(&args, name)]));
43 }
44
45 if args.zero { v.iter().for_each(|name| print!("{}", name));
47 } else { v.iter().for_each(|name| println!("{} ", name));
49 }
50}
51
52fn print(args: &Args, name: &String) -> String {
54 if let Some(name) = name.split('/').last() {
55 if let Some(suffix) = &args.suffix {
56 if name.ends_with(suffix) {
57 if let Some(n) = name.strip_suffix(suffix) {
58 return n.to_string();
59 }
60 }
61 }
62 return name.to_string();
63 }
64 name.to_string()
65}
66
67const HELP: &str = "Usage: basename NAME [SUFFIX]
68 or: basename OPTION... NAME...
69Print NAME with any leading directory components removed.
70If specified, also remove a trailing SUFFIX.
71
72 -a, --multiple support multiple arguments and treat each as a NAME
73 -s, --suffix SUFFIX remove a trailing SUFFIX; implies -a
74 -z, --zero end each output line with NUL, not newline
75 -h, --help display this help and exit
76 -v, --version output version information and exit
77";