use crate::ui::UI;
use anyhow::Result;
use vx_paths::{PathManager, PathResolver};
use vx_plugin::PluginRegistry;
pub async fn handle(
registry: &PluginRegistry,
tool: Option<&str>,
show_status: bool,
) -> Result<()> {
let path_manager = PathManager::new()
.map_err(|e| anyhow::anyhow!("Failed to initialize path manager: {}", e))?;
let resolver = PathResolver::new(path_manager);
match tool {
Some(tool_name) => {
list_tool_versions(registry, &resolver, tool_name, show_status).await?;
}
None => {
list_all_tools(registry, &resolver, show_status).await?;
}
}
Ok(())
}
async fn list_tool_versions(
registry: &PluginRegistry,
resolver: &PathResolver,
tool_name: &str,
show_status: bool,
) -> Result<()> {
let tool = registry.get_tool(tool_name);
if tool.is_none() {
UI::error(&format!("Tool '{}' is not supported", tool_name));
UI::hint("Use 'vx list' to see all supported tools");
return Ok(());
}
UI::info(&format!("📦 {}", tool_name));
let installed_versions = resolver.manager().list_tool_versions(tool_name)?;
if installed_versions.is_empty() {
UI::hint(" No versions installed");
if show_status {
UI::hint(&format!(
" Use 'vx install {}' to install this tool",
tool_name
));
}
return Ok(());
}
for version in &installed_versions {
let status_icon = if show_status { "✅" } else { " " };
println!(" {} {}", status_icon, version);
if show_status {
let exe_path = resolver.manager().tool_executable_path(tool_name, version);
println!(" 📁 {}", exe_path.display());
}
}
if show_status {
UI::success(&format!(
"Total: {} version(s) installed",
installed_versions.len()
));
}
Ok(())
}
async fn list_all_tools(
registry: &PluginRegistry,
resolver: &PathResolver,
show_status: bool,
) -> Result<()> {
UI::info("📦 Available Tools:");
let supported_tools = registry.list_tools();
let installed_tools = resolver.manager().list_installed_tools()?;
for tool_name in &supported_tools {
let is_installed = installed_tools.contains(tool_name);
let status_icon = if is_installed { "✅" } else { "❌" };
if let Some(tool) = registry.get_tool(tool_name) {
println!(" {} {} - {}", status_icon, tool_name, tool.description());
if show_status && is_installed {
let versions = resolver.manager().list_tool_versions(tool_name)?;
if !versions.is_empty() {
println!(" Versions: {}", versions.join(", "));
}
}
}
}
if show_status {
let total_supported = supported_tools.len();
let total_installed = installed_tools.len();
UI::info(&format!(
"\n📊 Summary: {}/{} tools installed",
total_installed, total_supported
));
}
Ok(())
}