diff options
| author | Naz <ndpm13@ch-naseem.com> | 2025-08-07 17:01:44 +0100 |
|---|---|---|
| committer | Naz <ndpm13@ch-naseem.com> | 2025-08-07 17:01:44 +0100 |
| commit | 75e49e6571cf991f36d3b0cab481f984afa51c44 (patch) | |
| tree | eb9718bc978f16faf53796d64bc7a93d9f551fa4 /src/github.rs | |
| parent | bf42f2e19d8bf710d149c6c6f7301fae2310ba41 (diff) | |
| parent | b47a4357c43b37fdd0c9cb4489acba8943022a27 (diff) | |
Merge pull request 'feat/issue-15' (#16) from feat/issue-15 into main
Reviewed-on: https://git.ch-naseem.com/ndpm13/zap-rs/pulls/16
Diffstat (limited to 'src/github.rs')
| -rw-r--r-- | src/github.rs | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/src/github.rs b/src/github.rs new file mode 100644 index 0000000..a37e7b1 --- /dev/null +++ b/src/github.rs @@ -0,0 +1,73 @@ +use dialoguer::FuzzySelect; +use octocrab::models::repos::Asset; + +use crate::{AppImage, Error, Result}; + +pub async fn get_github_release_url(appimage: &AppImage) -> Result<String> { + let octocrab = octocrab::instance(); + + let (owner, repo) = appimage + .source + .meta + .url + .split_once('/') + .ok_or_else(|| Error::InvalidSlug(appimage.source.meta.url.to_string()))?; + + let page = octocrab + .repos(owner, repo) + .releases() + .list() + .per_page(100) + .send() + .await?; + + let mut tags: Vec<String> = vec![]; + + for releases in &page { + for asset in &releases.assets { + if asset.name.to_lowercase().ends_with(".appimage") { + tags.push(releases.tag_name.to_string()); + break; + } + } + } + + let tag_selection = FuzzySelect::new() + .with_prompt("Choose a release") + .items(&tags) + .max_length(7) + .vim_mode(true) + .interact()?; + + let mut assets: Vec<Asset> = vec![]; + + for releases in page { + if releases.tag_name == tags[tag_selection] { + for asset in releases.assets { + if asset.name.to_lowercase().ends_with(".appimage") { + assets.push(asset); + } + } + } + } + + let mut asset_selection: usize = 0; + + if assets.len() > 1 { + asset_selection = FuzzySelect::new() + .with_prompt("Choose an asset") + .items( + &assets + .iter() + .map(|x| x.name.to_string()) + .collect::<Vec<_>>(), + ) + .max_length(7) + .vim_mode(true) + .interact()?; + } + + let url = assets[asset_selection].browser_download_url.to_string(); + + Ok(url) +} |
