vx_cli/commands/
remove.rs1use 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 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 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 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}