libtest_cli/
libtest-cli.rs

1fn main() -> lexarg::Result<()> {
2    use lexarg::prelude::*;
3
4    let mut test_opts = libtest_lexarg::TestOptsBuilder::new();
5
6    let raw = std::env::args_os().collect::<Vec<_>>();
7    let mut parser = lexarg::Parser::new(&raw);
8    let bin = parser
9        .next_raw()
10        .expect("first arg, no pending values")
11        .unwrap_or(std::ffi::OsStr::new("test"));
12    let mut prev_arg = Value(bin);
13    while let Some(arg) = parser.next_arg() {
14        match arg {
15            Short("h") | Long("help") => {
16                let bin = bin.to_string_lossy();
17                let options_help = libtest_lexarg::OPTIONS_HELP.trim();
18                let after_help = libtest_lexarg::AFTER_HELP.trim();
19                println!(
20                    "Usage: {bin} [OPTIONS] [FILTER]...
21
22{options_help}
23
24{after_help}"
25                );
26                std::process::exit(0);
27            }
28            // All values are the same, whether escaped or not, so its a no-op
29            Escape(_) => {
30                prev_arg = arg;
31                continue;
32            }
33            Unexpected(_) => {
34                return Err(lexarg::LexError::msg("unexpected value")
35                    .unexpected(arg)
36                    .within(prev_arg)
37                    .into());
38            }
39            _ => {}
40        }
41        prev_arg = arg;
42
43        let arg = test_opts.parse_next(&mut parser, arg)?;
44
45        if let Some(arg) = arg {
46            return Err(lexarg::LexError::msg("unexpected argument")
47                .unexpected(arg)
48                .into());
49        }
50    }
51
52    let opts = test_opts.finish()?;
53    println!("{opts:#?}");
54
55    Ok(())
56}