vx_cli/commands/
fetch.rs

1//! Fetch command implementation
2
3use crate::ui::UI;
4use anyhow::Result;
5use vx_plugin::PluginRegistry;
6
7/// Handle the fetch command
8pub 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    // Limit versions if requested
30    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        // Limit output for non-detailed view
79        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}