diff --git a/src/bin/cargo/cli.rs b/src/bin/cargo/cli.rs index aa72d7c1a3b..4a1e24e0f4d 100644 --- a/src/bin/cargo/cli.rs +++ b/src/bin/cargo/cli.rs @@ -691,9 +691,32 @@ See 'cargo help <>' for more information on a sp })) }).collect() }))) + .add(clap_complete::engine::SubcommandCandidates::new(|| { + get_toolchains_from_rustup() + .into_iter() + .map(|t| clap_complete::CompletionCandidate::new(t)) + .collect() + })) .subcommands(commands::builtin()) } +fn get_toolchains_from_rustup() -> Vec { + let output = std::process::Command::new("rustup") + .arg("toolchain") + .arg("list") + .arg("-q") + .output() + .unwrap(); + + if !output.status.success() { + return vec![]; + } + + let stdout = String::from_utf8(output.stdout).unwrap(); + + stdout.lines().map(|line| format!("+{}", line)).collect() +} + #[test] fn verify_cli() { let gctx = GlobalContext::default().unwrap();