const HELP_FLAG: &str = "help h"; const VERSION_FLAG: &str = "version v"; const DONT_PERSIST: &str = "d"; pub struct Flags { pub help: bool, pub version: bool, pub dont_persist: bool, pub arg_count: usize } /// Parses an list of String arguments into a set of flags that can be used by crab /// #### Arguments /// * `args` - The list of String arguments /// #### Returns /// * `None` - If there is an invalid argument in the list /// * `Some(Flags)` - If the arguments were secussfully parsed, returning the flags 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) } /// Checks if a given string is a given argument fn is_arg(arg: &str) -> bool { return arg.starts_with("-"); } /// Sets a flag in a `Flags` struct /// #### Arguments /// * `arg` - The argument to check /// * `flags` - The `Flags` stuct to update /// #### Returns /// * `true` - If the argument passed is a valid flag /// * `false` - If the argument passed is not a valid flag 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 } /// Returns if a given argument is a certain flag /// #### Arguments /// * `arg` - The arch to check /// #### Returns /// * `true` - If the argument matches the flag /// * `false` - If the argument doesn't match the flag fn has_flag_set(arg: &str, check: &str) -> bool { for check_arg in check.split(" ") { if check_arg == arg { return true } } return false }