use crate::ui::UI;
use anyhow::Result;
use vx_plugin::PluginRegistry;
pub async fn handle(
registry: &PluginRegistry,
tool_name: &str,
version: Option<&str>,
force: bool,
) -> Result<()> {
let tool = registry
.get_tool(tool_name)
.ok_or_else(|| anyhow::anyhow!("Tool not found: {}", tool_name))?;
if let Some(target_version) = version {
UI::info(&format!("Removing {} {}...", tool_name, target_version));
match tool.remove_version(target_version, force).await {
Ok(()) => {
UI::success(&format!(
"Successfully removed {} {}",
tool_name, target_version
));
}
Err(e) => {
UI::error(&format!(
"Failed to remove {} {}: {}",
tool_name, target_version, e
));
return Err(e);
}
}
} else {
let installed_versions = tool.get_installed_versions().await?;
if installed_versions.is_empty() {
UI::warn(&format!("No versions of {} are installed", tool_name));
return Ok(());
}
if !force {
UI::warn(&format!(
"This will remove all {} versions: {}",
tool_name,
installed_versions.join(", ")
));
UI::hint("Use --force to confirm removal of all versions");
return Ok(());
}
UI::info(&format!("Removing all {} versions...", tool_name));
let mut errors = Vec::new();
for version in &installed_versions {
match tool.remove_version(version, true).await {
Ok(()) => {
UI::detail(&format!("Removed {} {}", tool_name, version));
}
Err(e) => {
UI::error(&format!(
"Failed to remove {} {}: {}",
tool_name, version, e
));
errors.push(e);
}
}
}
if errors.is_empty() {
UI::success(&format!("Successfully removed all {} versions", tool_name));
} else {
UI::warn(&format!(
"Removed some versions, but {} errors occurred",
errors.len()
));
}
}
Ok(())
}