use dialoguer::FuzzySelect; use octocrab::models::repos::Asset; use crate::{AppImage, Error, Result}; pub async fn get_github_release_url(appimage: &AppImage) -> Result { 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 = 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 = 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::>(), ) .max_length(7) .vim_mode(true) .interact()?; } let url = assets[asset_selection].browser_download_url.to_string(); Ok(url) }