use clap_lex::RawArgs;
use std::ffi::OsString;
pub fn find_parameter(
name: &str,
args_os: impl IntoIterator<Item: Into<OsString>>,
) -> Option<OsString> {
let raw = RawArgs::new(args_os);
let mut cursor = raw.cursor();
raw.next(&mut cursor);
while let Some(arg) = raw.next(&mut cursor) {
if arg.is_escape() {
return None;
} else if let Some((maybe_flag, maybe_value)) = arg.to_long() {
let Ok(flag) = maybe_flag else {
continue;
};
if flag != name {
continue;
}
if let Some(value) = maybe_value {
return Some(value.to_owned());
} else {
return raw.next_os(&mut cursor).map(|os_str| os_str.to_owned());
}
}
}
None
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_find_parameter() {
assert_eq!(None, find_parameter("foo", ["."]));
assert_eq!(
"x",
find_parameter("foo", [".", "--foo=x"])
.unwrap()
.to_string_lossy()
);
assert_eq!(None, find_parameter("fo", [".", "--foo=x"]));
assert_eq!(None, find_parameter("fooo", [".", "--foo=x"]));
assert_eq!(
"x",
find_parameter("foo", [".", "-zed", "z", "--foo=x"])
.unwrap()
.to_string_lossy()
);
assert_eq!(None, find_parameter("fo", [".", "-zed", "z", "--foo=x"]));
assert_eq!(None, find_parameter("fooo", [".", "-zed", "z", "--foo=x"]));
assert_eq!(
"x",
find_parameter("foo", [".", "--foo", "x"])
.unwrap()
.to_string_lossy()
);
assert_eq!(None, find_parameter("fo", [".", "--foo", "x"]));
assert_eq!(None, find_parameter("fooo", [".", "--foo", "x"]));
assert_eq!(
"x",
find_parameter("foo", [".", "-zed", "z", "--foo", "x"])
.unwrap()
.to_string_lossy()
);
assert_eq!(None, find_parameter("fo", [".", "-zed", "z", "--foo", "x"]));
assert_eq!(
None,
find_parameter("fooo", [".", "-zed", "z", "--foo", "x"])
);
assert_eq!(None, find_parameter("foo", [".", "--foo"]));
assert_eq!(None, find_parameter("foo", [".", "--bar=9", "--foo"]));
assert_eq!(
"x",
find_parameter("foo", [".", "--foo=x", "--foo", "y"])
.unwrap()
.to_string_lossy()
);
assert_eq!(
"x",
find_parameter("foo", [".", "--foo", "x", "--foo", "y"])
.unwrap()
.to_string_lossy()
);
assert_eq!(
"x",
find_parameter("foo", [".", "--bar=9", "--foo=x", "--foo", "y"])
.unwrap()
.to_string_lossy()
);
assert_eq!(
"x",
find_parameter("foo", [".", "--bar=9", "--foo", "x", "--foo", "y"])
.unwrap()
.to_string_lossy()
);
assert_eq!(
None,
find_parameter("fo", [".", "--bar=9", "--foo=x", "--foo", "y"])
);
assert_eq!(
None,
find_parameter("fo", [".", "--bar=9", "--foo", "x", "--foo", "y"])
);
}
}