diff --git a/src/bin/cargo-miri.rs b/src/bin/cargo-miri.rs index 2dc6eee5de9..436b6a9430b 100644 --- a/src/bin/cargo-miri.rs +++ b/src/bin/cargo-miri.rs @@ -53,14 +53,32 @@ fn show_error(msg: String) -> ! { std::process::exit(1) } -fn list_targets(mut args: impl Iterator) -> impl Iterator { +fn get_arg_flag_value(name: &str) -> Option { + // stop searching at `--` + let mut args = std::env::args().skip_while(|val| !(val.starts_with(name) || val == "--")); + + match args.next() { + Some(ref p) if p == "--" => None, + Some(ref p) if p == name => args.next(), + Some(p) => { + // Make sure this really starts with `$name=`, we didn't test for the `=` yet. + let v = &p[name.len()..]; // strip leading `$name` + if v.starts_with('=') { + Some(v[1..].to_owned()) // strip leading `=` + } else { + None + } + }, + None => None, + } +} + +fn list_targets() -> impl Iterator { // We need to get the manifest, and then the metadata, to enumerate targets. - let manifest_path_arg = args.find(|val| { - val.starts_with("--manifest-path=") - }); + let manifest_path = get_arg_flag_value("--manifest-path").map(PathBuf::from); let mut metadata = if let Ok(metadata) = cargo_metadata::metadata( - manifest_path_arg.as_ref().map(AsRef::as_ref), + manifest_path.as_ref().map(AsRef::as_ref), ) { metadata @@ -68,10 +86,6 @@ fn list_targets(mut args: impl Iterator) -> impl Iterator