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