vx_cli/commands/
remove.rs

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