aboutsummaryrefslogtreecommitdiffstats
path: root/src/minecraft/manifests.rs
diff options
context:
space:
mode:
authorFilip Wandzio <contact@philw.dev>2026-01-22 23:14:08 +0100
committerFilip Wandzio <contact@philw.dev>2026-01-22 23:14:08 +0100
commit72ddd7b7704f2087a52c9c0552446682918c513b (patch)
treee5134f215ea82c1fc8eda17b34e426a7b1dfafc6 /src/minecraft/manifests.rs
downloaddml-72ddd7b7704f2087a52c9c0552446682918c513b.tar.gz
dml-72ddd7b7704f2087a52c9c0552446682918c513b.zip
Implement basic game files download logic
Implement core clap arguments Respect XDG_BASE_DIR Currently library extraction is broken because it assumes every instace has it's own library folder. This should be refactored so instances share libraries Signed-off-by: Filip Wandzio <contact@philw.dev>
Diffstat (limited to 'src/minecraft/manifests.rs')
-rw-r--r--src/minecraft/manifests.rs80
1 files changed, 80 insertions, 0 deletions
diff --git a/src/minecraft/manifests.rs b/src/minecraft/manifests.rs
new file mode 100644
index 0000000..3cc59af
--- /dev/null
+++ b/src/minecraft/manifests.rs
@@ -0,0 +1,80 @@
1#![allow(dead_code)]
2use reqwest;
3use serde::Deserialize;
4
5use crate::{constants::VERSION_MANIFEST_URL, errors::McError};
6
7#[derive(Debug, Deserialize)]
8pub struct Version {
9 pub id: String,
10
11 #[serde(rename = "mainClass")]
12 pub main_class: String,
13
14 pub downloads: Downloads,
15 pub libraries: Vec<Library>,
16}
17
18#[derive(Debug, Deserialize)]
19pub struct Downloads {
20 pub client: DownloadInfo,
21}
22
23#[derive(Debug, Deserialize)]
24pub struct DownloadInfo {
25 pub url: String,
26 pub sha1: String,
27 pub size: u64,
28}
29
30#[derive(Debug, Deserialize)]
31pub struct Library {
32 pub downloads: LibraryDownloads,
33}
34
35#[derive(Debug, Deserialize)]
36pub struct LibraryDownloads {
37 pub artifact: Option<LibraryArtifact>,
38}
39
40#[derive(Debug, Deserialize)]
41pub struct LibraryArtifact {
42 pub path: String,
43 pub url: String,
44 pub sha1: String,
45 pub size: u64,
46}
47
48pub async fn load_version(cfg: &crate::config::Config) -> Result<Version, McError> {
49 let manifest_text = reqwest::get(VERSION_MANIFEST_URL)
50 .await?
51 .text()
52 .await?;
53 let root: serde_json::Value = serde_json::from_str(&manifest_text)?;
54 let version_id = if cfg.version == "latest" {
55 root["latest"]["release"]
56 .as_str()
57 .ok_or_else(|| McError::Config("missing latest.release".into()))?
58 .to_string()
59 } else {
60 cfg.version.clone()
61 };
62
63 let versions = root["versions"]
64 .as_array()
65 .ok_or_else(|| McError::Config("missing versions array".into()))?;
66
67 let version_entry = versions
68 .iter()
69 .find(|v| v["id"].as_str() == Some(&version_id))
70 .ok_or_else(|| McError::Config(format!("version '{}' not found", version_id)))?;
71
72 let url = version_entry["url"]
73 .as_str()
74 .ok_or_else(|| McError::Config("missing version url".into()))?;
75
76 let version_text = reqwest::get(url).await?.text().await?;
77 let version: Version = serde_json::from_str(&version_text)?;
78
79 Ok(version)
80}