vx_cli/commands/
fetch.rs

1//! Fetch command implementation
2
3use crate::ui::UI;
4use vx_core::{PluginRegistry, Result, VxError};
5
6/// Handle the fetch command
7pub 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    // Limit versions if requested
31    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        // Limit output for non-detailed view
80        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}