ketcindyinstaller/worker/
fetcher.rs1use 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 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 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 anyhow::bail!("Package not found.");
59}