dash_dash/
dash_dash.rs

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