Parse command-line flags without dependencies
Rust
use std::collections::HashMap;
#[derive(Debug, Default)]
struct Args {
flags: HashMap<String, String>,
rest: Vec<String>,
}
/// Parse "--key=value" and "--key value" pairs plus bare positional args.
fn parse_args(args: impl Iterator<Item = String>) -> Result<Args, String> {
let mut parsed = Args::default();
let mut iter = args;
while let Some(arg) = iter.next() {
if !arg.starts_with("--") {
parsed.rest.push(arg);
continue;
}
let spec = &arg[2..];
let (key, value) = match spec.split_once('=') {
Some((key, value)) => (key.to_string(), value.to_string()),
None => {
let value = iter.next().ok_or(format!("missing value for --{spec}"))?;
(spec.to_string(), value)
}
};
parsed.flags.insert(key, value);
}
Ok(parsed)
}
fn main() -> Result<(), String> {
let args = parse_args(std::env::args().skip(1))?;
println!("{:?}", args);
Ok(())
}