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