Skip to main content

conduit_cli/core/api/mojang/
mod.rs

1pub mod models;
2
3use self::models::{VersionDetails, VersionEntry, VersionManifest};
4use crate::errors::{ConduitError, ConduitResult};
5use reqwest::Client;
6
7pub struct MojangClient {
8    client: Client,
9}
10
11impl Default for MojangClient {
12    fn default() -> Self {
13        Self {
14            client: Client::new(),
15        }
16    }
17}
18
19impl MojangClient {
20    pub async fn get_manifest(&self) -> ConduitResult<VersionManifest> {
21        let url = "https://piston-meta.mojang.com/mc/game/version_manifest_v2.json";
22        let response = self.client.get(url).send().await?;
23
24        let manifest = response.json::<VersionManifest>().await?;
25        Ok(manifest)
26    }
27
28    pub async fn get_versions_by_type(
29        &self,
30        version_type: &str,
31    ) -> ConduitResult<Vec<VersionEntry>> {
32        let manifest = self.get_manifest().await?;
33        let filtered = manifest
34            .versions
35            .into_iter()
36            .filter(|v| v.r#type == version_type)
37            .collect();
38
39        Ok(filtered)
40    }
41
42    pub async fn get_version_details(&self, version_id: &str) -> ConduitResult<VersionDetails> {
43        let manifest = self.get_manifest().await?;
44        let version_entry = manifest
45            .versions
46            .iter()
47            .find(|v| v.id == version_id)
48            .ok_or_else(|| ConduitError::NotFound(version_id.to_string()))?;
49
50        let response = self.client.get(&version_entry.url).send().await?;
51        let details = response.json::<VersionDetails>().await?;
52        Ok(details)
53    }
54
55    pub async fn get_server_url(&self, version_id: &str) -> ConduitResult<String> {
56        let details = self.get_version_details(version_id).await?;
57
58        let server_download = details
59            .downloads
60            .server
61            .ok_or_else(|| ConduitError::NotFound(format!("server jar for {version_id}")))?;
62
63        Ok(server_download.url)
64    }
65}