Skip to main content

conduit_cli/core/api/purpurmc/
mod.rs

1pub mod models;
2
3use crate::errors::{ConduitError, ConduitResult};
4
5use self::models::{PurpurBuildsResponse, PurpurVersionsResponse};
6use reqwest::Client;
7
8pub struct PurpurClient {
9    client: Client,
10}
11
12impl Default for PurpurClient {
13    fn default() -> Self {
14        Self {
15            client: Client::new(),
16        }
17    }
18}
19
20impl PurpurClient {
21    pub async fn get_versions(&self) -> ConduitResult<Vec<String>> {
22        let url = "https://api.purpurmc.org/v2/purpur";
23        let response = self.client.get(url).send().await?;
24        let data = response.json::<PurpurVersionsResponse>().await?;
25        Ok(data.versions)
26    }
27
28    pub async fn get_latest_build(&self, version: &str) -> ConduitResult<String> {
29        let url = format!("https://api.purpurmc.org/v2/purpur/{version}");
30        let response = self.client.get(url).send().await?;
31
32        if response.status() == 404 {
33            return Err(ConduitError::NotFound(format!("Purpur version {version}")));
34        }
35
36        let data = response.json::<PurpurBuildsResponse>().await?;
37        data.builds
38            .latest
39            .ok_or_else(|| ConduitError::NotFound(format!("No builds for {version}")))
40    }
41
42    pub fn build_download_url(&self, version: &str, build: &str) -> String {
43        format!("https://api.purpurmc.org/v2/purpur/{version}/{build}/download")
44    }
45}