conduit_cli/core/api/purpurmc/
mod.rs1pub 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}