summaryrefslogtreecommitdiff
path: root/src/github.rs
blob: 50812d130d79cc6365549fa0af6e908921a7ff41 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
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)
        .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<_>>(),
            )
            .interact()?;
    }

    let url = assets[asset_selection].browser_download_url.to_string();

    Ok(url)
}