1use crate::ui::UI;
4use anyhow::Result;
5use vx_plugin::PluginRegistry;
6
7pub async fn handle(
9 registry: &PluginRegistry,
10 tool_name: &str,
11 latest: Option<usize>,
12 include_prerelease: bool,
13 detailed: bool,
14 interactive: bool,
15) -> Result<()> {
16 let tool = registry
17 .get_tool(tool_name)
18 .ok_or_else(|| anyhow::anyhow!("Tool not found: {}", tool_name))?;
19
20 UI::info(&format!("Fetching versions for {}...", tool_name));
21
22 let mut versions = tool.fetch_versions(include_prerelease).await?;
23
24 if versions.is_empty() {
25 UI::warn("No versions found");
26 return Ok(());
27 }
28
29 if let Some(limit) = latest {
31 versions.truncate(limit);
32 }
33
34 UI::success(&format!("Found {} versions:", versions.len()));
35
36 for (i, version) in versions.iter().enumerate() {
37 let prerelease_marker = if version.prerelease {
38 " (prerelease)"
39 } else {
40 ""
41 };
42 let lts_marker = if version.metadata.get("lts") == Some(&"true".to_string()) {
43 " (LTS)"
44 } else {
45 ""
46 };
47
48 if detailed {
49 UI::item(&format!(
50 "{}. {}{}{}",
51 i + 1,
52 version.version,
53 prerelease_marker,
54 lts_marker
55 ));
56
57 if let Some(date) = &version.release_date {
58 UI::detail(&format!(" Released: {}", date));
59 }
60
61 if let Some(notes) = &version.release_notes {
62 UI::detail(&format!(" Notes: {}", notes));
63 }
64
65 if let Some(url) = &version.download_url {
66 UI::detail(&format!(" Download: {}", url));
67 }
68 } else {
69 UI::item(&format!(
70 "{}. {}{}{}",
71 i + 1,
72 version.version,
73 prerelease_marker,
74 lts_marker
75 ));
76 }
77
78 if !detailed && i >= 19 {
80 UI::detail(&format!(" ... and {} more versions", versions.len() - 20));
81 UI::hint("Use --detailed to see all versions");
82 break;
83 }
84 }
85
86 if interactive {
87 UI::hint("Interactive version selection not yet implemented");
88 UI::hint(&format!("Use: vx install {}@<version>", tool_name));
89 }
90
91 Ok(())
92}