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