ketcindyinstaller/worker/
fetcher.rs

1use anyhow::Result;
2
3pub(super) async fn fetch_from_github(
4    owner: &str,
5    repository: &str,
6) -> Result<Vec<octocrab::models::repos::Release>> {
7    Ok(octocrab::instance()
8        .repos(owner, repository)
9        .releases()
10        .list()
11        .send()
12        .await?
13        .take_items())
14}
15
16#[derive(serde::Deserialize)]
17pub(super) struct HomebrewResponse {
18    pub(super) version: String,
19}
20
21#[derive(serde::Deserialize)]
22struct CaskJson {
23    version: String,
24}
25
26#[derive(serde::Deserialize)]
27struct FormulaJson {
28    versions: Versions,
29}
30
31#[derive(serde::Deserialize)]
32struct Versions {
33    stable: String,
34}
35
36pub(super) async fn fetch_from_homebrew(package_name: &str) -> Result<HomebrewResponse> {
37    // 1. try cask
38    let cask_url = format!("https://formulae.brew.sh/api/cask/{}.json", package_name);
39    let response = reqwest::get(cask_url).await?;
40    if response.status() == reqwest::StatusCode::OK {
41        let parsed_response = response.json::<CaskJson>().await?;
42        return Ok(HomebrewResponse {
43            version: parsed_response.version,
44        });
45    }
46
47    // 2. try formula
48    let formula_url = format!("https://formulae.brew.sh/api/formula/{}.json", package_name);
49    let response = reqwest::get(formula_url).await?;
50    if response.status() == reqwest::StatusCode::OK {
51        let parsed_response = response.json::<FormulaJson>().await?;
52        return Ok(HomebrewResponse {
53            version: parsed_response.versions.stable,
54        });
55    }
56
57    // not found
58    anyhow::bail!("Package not found.");
59}