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