arm_toolchain/cli/
use_cmd.rs

1use crate::{
2    cli::{CliError, confirm_install, ctrl_c_cancel, install_with_progress_bar, msg},
3    toolchain::{ToolchainClient, ToolchainVersion},
4};
5
6#[derive(Debug, clap::Parser)]
7pub struct UseArgs {
8    /// Version of LLVM to install
9    pub llvm_version: ToolchainVersion,
10}
11
12pub async fn use_cmd(args: UseArgs) -> Result<(), CliError> {
13    let mut version = args.llvm_version;
14
15    let client = ToolchainClient::using_data_dir().await?;
16
17    let install_latest = version.name == "latest";
18    let mut release = None;
19
20    // If "latest" specified we have to figure out what that actually means first
21    if install_latest {
22        let latest = client.latest_release().await?;
23        version = latest.version().clone();
24        release = Some(latest);
25    }
26
27    let installed_versions = client.installed_versions().await?;
28    let is_installed = installed_versions.contains(&version);
29
30    if !is_installed {
31        let release = if let Some(rel) = release {
32            rel
33        } else {
34            client.get_release(&version).await?
35        };
36
37        confirm_install(&version, install_latest).await?;
38
39        let token = ctrl_c_cancel();
40        install_with_progress_bar(&client, &release, token.clone()).await?;
41
42        // Release Ctrl-C listener
43        token.cancel();
44    } else if client.active_toolchain().as_ref() == Some(&version) {
45        println!("Toolchain {version} is already enabled.");
46        return Ok(());
47    }
48
49    client.set_active_toolchain(Some(version.clone())).await?;
50
51    msg!("Activated", "{version}");
52
53    Ok(())
54}