in tools/rustdoc/rustdoc_test_writer.rs [27:90]
fn parse_args() -> Options {
let args: Vec<String> = env::args().into_iter().collect();
let (writer_args, action_args) = {
let split = args
.iter()
.position(|arg| arg == "--")
.expect("Unable to find split identifier `--`");
// Converting each set into a vector makes them easier to parse in
// the absence of nightly features
let (writer, action) = args.split_at(split);
(writer.to_vec(), action.to_vec())
};
// Remove the leading `--` which is expected to be the first
// item in `action_args`
debug_assert_eq!(action_args[0], "--");
let action_argv = action_args[1..].to_vec();
let output = writer_args
.iter()
.find(|arg| arg.starts_with("--output="))
.and_then(|arg| arg.splitn(2, '=').last())
.map(PathBuf::from)
.expect("Missing `--output` argument");
let (strip_substring_args, writer_args): (Vec<String>, Vec<String>) = writer_args
.into_iter()
.partition(|arg| arg.starts_with("--strip_substring="));
let mut strip_substrings: Vec<String> = strip_substring_args
.into_iter()
.map(|arg| {
arg.splitn(2, '=')
.last()
.expect("--strip_substring arguments must have assignments using `=`")
.to_owned()
})
.collect();
// Strip substrings should always be in reverse order of the length of each
// string so when filtering we know that the longer strings are checked
// first in order to avoid cases where shorter strings might match longer ones.
strip_substrings.sort_by_key(|b| Reverse(b.len()));
strip_substrings.dedup();
let env_keys = writer_args
.into_iter()
.filter(|arg| arg.starts_with("--action_env="))
.map(|arg| {
arg.splitn(2, '=')
.last()
.expect("--env arguments must have assignments using `=`")
.to_owned()
})
.collect();
Options {
env_keys,
strip_substrings,
output,
action_argv,
}
}