pub struct Flags { pub help: bool, pub version: bool, pub dont_persist: bool, pub arg_count: usize } pub fn parse(args: &[String]) -> Option { let mut flags = Flags { help: false, version: false, dont_persist: false, arg_count: 0 }; for arg in args { if !is_arg(&arg) { break; } flags.arg_count += 1; if arg.starts_with("--") { let flag = &arg[2..]; if !set_flag(&flag, &mut flags) { eprintln!("Invalid argument: {}", arg); return None } } else { let flag = &arg[1..]; for char in flag.chars() { if !set_flag(&char.to_string(), &mut flags) { eprintln!("Invalid argument: {}", arg); return None } } } } Some(flags) } fn is_arg(arg: &str) -> bool { return arg.starts_with("-"); } const HELP_FLAG: &str = "help h"; const VERSION_FLAG: &str = "version v"; const DONT_PERSIST: &str = "d"; fn set_flag(arg: &str, flags: &mut Flags) -> bool { if has_flag_set(&arg, HELP_FLAG) { flags.help = true; return true } else if has_flag_set(&arg, VERSION_FLAG) { flags.version = true; return true } else if has_flag_set(&arg, DONT_PERSIST) { flags.dont_persist = true; return true } false } fn has_flag_set(arg: &str, check: &str) -> bool { for check_arg in check.split(" ") { if check_arg == arg { return true } } return false }