Skip to main content

conduit_cli/core/api/neoforged/
mod.rs

1pub mod models;
2
3use self::models::Metadata;
4use crate::errors::{ConduitError, ConduitResult};
5use quick_xml::de::from_str;
6use reqwest::Client;
7
8pub struct NeoForgeClient {
9    client: Client,
10}
11
12impl Default for NeoForgeClient {
13    fn default() -> Self {
14        Self {
15            client: Client::new(),
16        }
17    }
18}
19
20impl NeoForgeClient {
21    pub async fn get_metadata(&self) -> ConduitResult<Metadata> {
22        let url = "https://maven.neoforged.net/releases/net/neoforged/neoforge/maven-metadata.xml";
23        let response = self.client.get(url).send().await?.text().await?;
24
25        let metadata: Metadata = from_str(&response)
26            .map_err(|e| ConduitError::Deserialize(format!("failed to parse neoforge xml: {e}")))?;
27
28        Ok(metadata)
29    }
30
31    pub async fn get_latest_version(&self) -> ConduitResult<String> {
32        let meta = self.get_metadata().await?;
33        Ok(meta.versioning.release)
34    }
35
36    pub fn build_bin_url(&self, version: &str, classifier: &str) -> String {
37        let base = "https://maven.neoforged.net/releases";
38        let group = "net/neoforged/neoforge";
39        let artifact = "neoforge";
40
41        format!("{base}/{group}/{version}/{artifact}-{version}-{classifier}.jar")
42    }
43}