#![allow(dead_code)]
pub fn eager_parse_cli_flag(flag_name: &str, argv: Option<Vec<String>>) -> Option<String> {
let argv = argv.unwrap_or_else(|| std::env::args().collect());
for i in 0..argv.len() {
let arg = argv.get(i)?;
if arg.starts_with(&format!("{}=", flag_name)) {
return Some(arg[flag_name.len() + 1..].to_string());
}
if arg == flag_name && i + 1 < argv.len() {
return Some(argv[i + 1].clone());
}
}
None
}
pub fn extract_args_after_double_dash(
command_or_value: &str,
args: Option<Vec<String>>,
) -> (String, Vec<String>) {
let args = args.unwrap_or_default();
if command_or_value == "--" && !args.is_empty() {
let command = args[0].clone();
let remaining = args[1..].to_vec();
return (command, remaining);
}
(command_or_value.to_string(), args)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_eager_parse_cli_flag_equals() {
let argv = vec!["prog".to_string(), "--flag=value".to_string()];
assert_eq!(
eager_parse_cli_flag("--flag", Some(argv)),
Some("value".to_string())
);
}
#[test]
fn test_eager_parse_cli_flag_space() {
let argv = vec![
"prog".to_string(),
"--flag".to_string(),
"value".to_string(),
];
assert_eq!(
eager_parse_cli_flag("--flag", Some(argv)),
Some("value".to_string())
);
}
#[test]
fn test_eager_parse_cli_flag_not_found() {
let argv = vec!["prog".to_string(), "--other".to_string()];
assert_eq!(eager_parse_cli_flag("--flag", Some(argv)), None);
}
#[test]
fn test_extract_args_after_double_dash() {
let args = vec![
"subcmd".to_string(),
"--flag".to_string(),
"arg".to_string(),
];
let (command, remaining) = extract_args_after_double_dash("--", Some(args));
assert_eq!(command, "subcmd");
assert_eq!(remaining, vec!["--flag", "arg"]);
}
#[test]
fn test_extract_args_no_double_dash() {
let args = vec!["--flag".to_string(), "arg".to_string()];
let (command, remaining) = extract_args_after_double_dash("name", Some(args));
assert_eq!(command, "name");
assert_eq!(remaining, vec!["--flag", "arg"]);
}
}