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