dash_dash/
dash_dash.rs

1#![allow(dead_code)]
2
3#[derive(Debug)]
4struct Args {
5    forwarded_args: Vec<String>,
6    help: bool,
7}
8
9fn parse_args() -> Result<Args, no_pico_args::Error> {
10    let mut args: Vec<_> = std::env::args_os()
11        .map(|s| s.into_string().expect("Non-UTF-8 argument"))
12        .collect();
13    args.remove(0); // remove the executable path.
14
15    // Find and process `--`.
16    let forwarded_args = if let Some(dash_dash) = args.iter().position(|arg| arg == "--") {
17        // Store all arguments following ...
18        let later_args = args.drain(dash_dash + 1..).collect();
19        // .. then remove the `--`
20        args.pop();
21        later_args
22    } else {
23        Vec::new()
24    };
25
26    // Now pass the remaining arguments through to `pico_args`.
27    let mut args = no_pico_args::Arguments::from_vec(args);
28    let res = Args {
29        forwarded_args,
30        help: args.contains(["-h", "--help"]),
31    };
32
33    // It's up to the caller what to do with the remaining arguments.
34    let remaining = args.finish();
35    if !remaining.is_empty() {
36        eprintln!("Warning: unused arguments left: {:?}", remaining);
37    }
38
39    Ok(res)
40}
41
42fn main() {
43    match parse_args() {
44        Ok(args) => println!("{:#?}", args),
45        Err(err) => eprintln!("{}", err),
46    }
47}