Skip to main content

conduit_cli/core/api/papermc/
mod.rs

1pub mod models;
2
3use crate::errors::{ConduitError, ConduitResult};
4
5use self::models::{PaperBuild, PaperBuildsResponse};
6use reqwest::Client;
7
8pub struct PaperClient {
9    client: Client,
10}
11
12impl Default for PaperClient {
13    fn default() -> Self {
14        Self {
15            client: Client::new(),
16        }
17    }
18}
19
20impl PaperClient {
21    pub async fn get_latest_build(&self, mc_version: &str) -> ConduitResult<PaperBuild> {
22        let url = format!("https://api.papermc.io/v2/projects/paper/versions/{mc_version}/builds");
23        let response = self.client.get(url).send().await?;
24
25        if response.status() == 404 {
26            return Err(ConduitError::NotFound(format!(
27                "Paper version {mc_version}"
28            )));
29        }
30
31        let data = response.json::<PaperBuildsResponse>().await?;
32
33        data.builds
34            .into_iter()
35            .last()
36            .ok_or_else(|| ConduitError::NotFound(format!("No builds found for {mc_version}")))
37    }
38
39    pub fn build_download_url(&self, mc_version: &str, build: u32, file_name: &str) -> String {
40        format!(
41            "https://api.papermc.io/v2/projects/paper/versions/{mc_version}/builds/{build}/downloads/{file_name}"
42        )
43    }
44}