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(())
}