summaryrefslogtreecommitdiff
path: root/src/github.rs
diff options
context:
space:
mode:
authorNaz <ndpm13@ch-naseem.com>2025-08-07 17:01:44 +0100
committerNaz <ndpm13@ch-naseem.com>2025-08-07 17:01:44 +0100
commit75e49e6571cf991f36d3b0cab481f984afa51c44 (patch)
treeeb9718bc978f16faf53796d64bc7a93d9f551fa4 /src/github.rs
parentbf42f2e19d8bf710d149c6c6f7301fae2310ba41 (diff)
parentb47a4357c43b37fdd0c9cb4489acba8943022a27 (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.rs73
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)
+}