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
use anyhow::Result;
use indicatif::ProgressBar;
use serde::Deserialize;
use std::time::Duration;

#[derive(Deserialize, Debug)]
pub(crate) struct Manifest {
    pub(crate) package: Package,
}

#[derive(Deserialize, Debug)]
pub(crate) struct Package {
    #[allow(dead_code)]
    pub(crate) name: String,
    #[allow(dead_code)]
    pub(crate) version: String,
    pub(crate) target: PackageTarget,
}

#[derive(Deserialize, Debug)]
pub(crate) struct PackageTarget {
    pub(crate) universal: Option<PackageMetadata>,
    pub(crate) amd64_windows: Option<PackageMetadata>,
    pub(crate) arm64_macos: Option<PackageMetadata>,
    pub(crate) amd64_macos: Option<PackageMetadata>,
}

#[derive(Deserialize, Debug)]
pub(crate) struct PackageMetadata {
    pub(crate) url: String,
}

impl Manifest {
    pub(crate) async fn fetch(package_name: &str) -> Result<Self> {
        let spinner = ProgressBar::new_spinner().with_message("Fetching manifest...");

        spinner.enable_steady_tick(Duration::from_millis(75));

        let raw_manifest = reqwest::get(format!("https://raw.githubusercontent.com/NXVZBGBFBEN/KeTCindyInstaller/manifests/manifests/{package_name}.toml"))
            .await?
            .error_for_status()?
            .text()
            .await?;
        let manifest = toml::from_str::<Manifest>(raw_manifest.as_str())?;

        spinner.finish();

        Ok(manifest)
    }
}