vx_cli/commands/
remove.rs

1//! Remove command implementation
2
3use crate::ui::UI;
4use anyhow::Result;
5use vx_plugin::PluginRegistry;
6
7pub async fn handle(
8    registry: &PluginRegistry,
9    tool_name: &str,
10    version: Option<&str>,
11    force: bool,
12) -> Result<()> {
13    // Get the tool from registry
14    let tool = registry
15        .get_tool(tool_name)
16        .ok_or_else(|| anyhow::anyhow!("Tool not found: {}", tool_name))?;
17
18    if let Some(target_version) = version {
19        // Remove specific version
20        UI::info(&format!("Removing {} {}...", tool_name, target_version));
21
22        match tool.remove_version(target_version, force).await {
23            Ok(()) => {
24                UI::success(&format!(
25                    "Successfully removed {} {}",
26                    tool_name, target_version
27                ));
28            }
29            Err(e) => {
30                UI::error(&format!(
31                    "Failed to remove {} {}: {}",
32                    tool_name, target_version, e
33                ));
34                return Err(e);
35            }
36        }
37    } else {
38        // Remove all versions
39        let installed_versions = tool.get_installed_versions().await?;
40
41        if installed_versions.is_empty() {
42            UI::warn(&format!("No versions of {} are installed", tool_name));
43            return Ok(());
44        }
45
46        if !force {
47            UI::warn(&format!(
48                "This will remove all {} versions: {}",
49                tool_name,
50                installed_versions.join(", ")
51            ));
52            UI::hint("Use --force to confirm removal of all versions");
53            return Ok(());
54        }
55
56        UI::info(&format!("Removing all {} versions...", tool_name));
57
58        let mut errors = Vec::new();
59        for version in &installed_versions {
60            match tool.remove_version(version, true).await {
61                Ok(()) => {
62                    UI::detail(&format!("Removed {} {}", tool_name, version));
63                }
64                Err(e) => {
65                    UI::error(&format!(
66                        "Failed to remove {} {}: {}",
67                        tool_name, version, e
68                    ));
69                    errors.push(e);
70                }
71            }
72        }
73
74        if errors.is_empty() {
75            UI::success(&format!("Successfully removed all {} versions", tool_name));
76        } else {
77            UI::warn(&format!(
78                "Removed some versions, but {} errors occurred",
79                errors.len()
80            ));
81        }
82    }
83
84    Ok(())
85}