Skip to content

Commit 8455487

Browse files
committed
Move config into own file, add implementation for StorageFormat
Also make sure there are no unknown fields on metadata to make sure we know about them.
1 parent 1b42905 commit 8455487

File tree

5 files changed

+260
-124
lines changed

5 files changed

+260
-124
lines changed

libmcmeta/src/models/forge.rs

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
use std::collections::HashMap;
2+
3+
use serde::{Deserialize, Serialize};
4+
5+
#[derive(Deserialize, Serialize, Clone, Debug)]
6+
pub struct ForgeMavenMetadata {
7+
#[serde(flatten)]
8+
pub versions: HashMap<String, Vec<String>>,
9+
}
10+
11+
#[derive(Deserialize, Serialize, Clone, Debug)]
12+
pub struct ForgeMavenPromotions {
13+
pub homepage: String,
14+
pub promos: HashMap<String, String>,
15+
}
16+
17+
#[derive(Deserialize, Serialize, Clone, Debug)]
18+
pub struct ForgeVersionMeta {
19+
pub classifiers: ForgeVersionClassifiers,
20+
}
21+
22+
#[derive(Deserialize, Serialize, Clone, Debug)]
23+
#[serde(deny_unknown_fields)]
24+
pub struct ForgeVersionClassifier {
25+
pub txt: Option<String>,
26+
pub zip: Option<String>,
27+
pub jar: Option<String>,
28+
pub stash: Option<String>,
29+
}
30+
31+
#[derive(Deserialize, Serialize, Clone, Debug)]
32+
#[serde(deny_unknown_fields)]
33+
pub struct ForgeVersionClassifiers {
34+
pub changelog: Option<ForgeVersionClassifier>,
35+
pub installer: Option<ForgeVersionClassifier>,
36+
pub mdk: Option<ForgeVersionClassifier>,
37+
pub universal: Option<ForgeVersionClassifier>,
38+
pub userdev: Option<ForgeVersionClassifier>,
39+
pub sources: Option<ForgeVersionClassifier>,
40+
pub javadoc: Option<ForgeVersionClassifier>,
41+
pub client: Option<ForgeVersionClassifier>,
42+
pub src: Option<ForgeVersionClassifier>,
43+
pub server: Option<ForgeVersionClassifier>,
44+
pub launcher: Option<ForgeVersionClassifier>,
45+
pub userdev3: Option<ForgeVersionClassifier>,
46+
#[serde(rename = "src.zip")]
47+
pub src_zip: Option<ForgeVersionClassifier>,
48+
}
49+
50+
#[cfg(test)]
51+
mod tests {
52+
#[test]
53+
fn test_deserialization() {
54+
// meta dir is ./meta
55+
let cwd = std::env::current_dir().unwrap();
56+
let meta_dir = cwd.join("../meta/forge");
57+
println!("meta_dir: {:?}", meta_dir);
58+
59+
let metadata_path = meta_dir.join("maven-metadata.json");
60+
let metadata = serde_json::from_str::<super::ForgeMavenMetadata>(
61+
&std::fs::read_to_string(metadata_path).unwrap(),
62+
);
63+
if let Err(e) = metadata {
64+
panic!("Failed to deserialize metadata: {:?}", e);
65+
}
66+
let metadata = metadata.unwrap();
67+
68+
let promotions_path = meta_dir.join("promotions_slim.json");
69+
let promotions = serde_json::from_str::<super::ForgeMavenPromotions>(
70+
&std::fs::read_to_string(promotions_path).unwrap(),
71+
);
72+
if let Err(e) = promotions {
73+
panic!("Failed to deserialize promotions: {:?}", e);
74+
}
75+
76+
for (_, forge_versions) in metadata.versions {
77+
for forge_version in forge_versions {
78+
let version_path = meta_dir.join(format!("files_manifests/{}.json", forge_version));
79+
let version = serde_json::from_str::<super::ForgeVersionMeta>(
80+
&std::fs::read_to_string(version_path).unwrap(),
81+
);
82+
if let Err(e) = version {
83+
panic!("Failed to deserialize version {}: {:?}", forge_version, e);
84+
}
85+
}
86+
}
87+
}
88+
}

libmcmeta/src/models/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ use std::{fmt::Display, str::FromStr};
22

33
use serde::{Deserialize, Serialize};
44

5+
pub mod forge;
56
pub mod mojang;
67

78
custom_error! { pub ModelError

libmcmeta/src/models/mojang.rs

Lines changed: 35 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use serde::{Deserialize, Serialize};
22

33
#[derive(Deserialize, Serialize, Debug)]
4-
#[serde(rename_all = "camelCase")]
4+
#[serde(rename_all = "camelCase", deny_unknown_fields)]
55
pub struct MojangVersionManifest {
66
/// The latest version of Minecraft.
77
pub latest: MojangVersionManifestLatest,
@@ -11,7 +11,7 @@ pub struct MojangVersionManifest {
1111

1212
/// The latest version of Minecraft.
1313
#[derive(Deserialize, Serialize, Debug)]
14-
#[serde(rename_all = "camelCase")]
14+
#[serde(rename_all = "camelCase", deny_unknown_fields)]
1515
pub struct MojangVersionManifestLatest {
1616
/// The latest release version of Minecraft.
1717
pub release: String,
@@ -21,7 +21,7 @@ pub struct MojangVersionManifestLatest {
2121

2222
/// A version of Minecraft.
2323
#[derive(Deserialize, Serialize, Debug)]
24-
#[serde(rename_all = "camelCase")]
24+
#[serde(rename_all = "camelCase", deny_unknown_fields)]
2525
pub struct MojangVersionManifestVersion {
2626
/// The ID of the version.
2727
pub id: String,
@@ -36,10 +36,12 @@ pub struct MojangVersionManifestVersion {
3636
pub release_time: String,
3737
/// Compliance level
3838
pub compliance_level: i32,
39+
/// The sha1 hash of the version's JSON.
40+
pub sha1: String,
3941
}
4042

4143
#[derive(Deserialize, Serialize, Debug)]
42-
#[serde(rename_all = "camelCase")]
44+
#[serde(rename_all = "camelCase", deny_unknown_fields)]
4345
pub struct AssetIndex {
4446
pub id: String,
4547
pub sha1: String,
@@ -49,29 +51,32 @@ pub struct AssetIndex {
4951
}
5052

5153
#[derive(Deserialize, Serialize, Debug)]
52-
#[serde(rename_all = "camelCase")]
54+
#[serde(rename_all = "camelCase", deny_unknown_fields)]
5355
pub struct VersionDownload {
5456
pub sha1: String,
5557
pub size: i32,
5658
pub url: String,
5759
}
5860

5961
#[derive(Deserialize, Serialize, Debug)]
60-
#[serde(rename_all = "camelCase")]
62+
#[serde(deny_unknown_fields)]
6163
pub struct VersionDownloads {
6264
pub client: VersionDownload,
6365
pub server: Option<VersionDownload>,
66+
pub windows_server: Option<VersionDownload>,
67+
pub client_mappings: Option<VersionDownload>,
68+
pub server_mappings: Option<VersionDownload>,
6469
}
6570

6671
#[derive(Deserialize, Serialize, Debug)]
67-
#[serde(rename_all = "camelCase")]
72+
#[serde(rename_all = "camelCase", deny_unknown_fields)]
6873
pub struct JavaVersion {
6974
pub component: String,
7075
pub major_version: i32,
7176
}
7277

7378
#[derive(Deserialize, Serialize, Debug)]
74-
#[serde(rename_all = "camelCase")]
79+
#[serde(rename_all = "camelCase", deny_unknown_fields)]
7580
pub struct VersionLibraryDownloadInfo {
7681
pub path: String,
7782
pub sha1: String,
@@ -80,41 +85,49 @@ pub struct VersionLibraryDownloadInfo {
8085
}
8186

8287
#[derive(Deserialize, Serialize, Debug)]
83-
#[serde(rename_all = "camelCase")]
88+
#[serde(rename_all = "camelCase", deny_unknown_fields)]
8489
pub struct VersionLibraryClassifiers {
8590
pub javadoc: Option<VersionLibraryDownloadInfo>,
8691
#[serde(rename = "natives-linux")]
8792
pub natives_linux: Option<VersionLibraryDownloadInfo>,
8893
#[serde(rename = "natives-macos")]
8994
pub natives_macos: Option<VersionLibraryDownloadInfo>,
95+
#[serde(rename = "natives-osx")]
96+
pub natives_osx: Option<VersionLibraryDownloadInfo>,
9097
#[serde(rename = "natives-windows")]
9198
pub natives_windows: Option<VersionLibraryDownloadInfo>,
99+
#[serde(rename = "natives-windows-32")]
100+
pub natives_windows_32: Option<VersionLibraryDownloadInfo>,
101+
#[serde(rename = "natives-windows-64")]
102+
pub natives_windows_64: Option<VersionLibraryDownloadInfo>,
103+
#[serde(rename = "linux-x86_64")]
104+
pub linux_x86_64: Option<VersionLibraryDownloadInfo>,
92105
pub sources: Option<VersionLibraryDownloadInfo>,
93106
}
94107

95108
#[derive(Deserialize, Serialize, Debug)]
96-
#[serde(rename_all = "camelCase")]
109+
#[serde(rename_all = "camelCase", deny_unknown_fields)]
97110
pub struct VersionLibraryNatives {
98111
pub linux: Option<String>,
99112
pub osx: Option<String>,
100113
pub windows: Option<String>,
101114
}
102115

103116
#[derive(Deserialize, Serialize, Debug)]
104-
#[serde(rename_all = "camelCase")]
117+
#[serde(rename_all = "camelCase", deny_unknown_fields)]
105118
pub struct VersionLibraryDownloads {
106119
pub artifact: Option<VersionLibraryDownloadInfo>,
107120
pub classifiers: Option<VersionLibraryClassifiers>,
108121
}
109122

110123
#[derive(Deserialize, Serialize, Debug)]
111-
#[serde(rename_all = "camelCase")]
124+
#[serde(rename_all = "camelCase", deny_unknown_fields)]
112125
pub struct VersionLibraryExtract {
113126
pub exclude: Vec<String>,
114127
}
115128

116129
#[derive(Deserialize, Serialize, Debug)]
117-
#[serde(rename_all = "camelCase")]
130+
#[serde(rename_all = "camelCase", deny_unknown_fields)]
118131
pub struct VersionLibrary {
119132
pub name: String,
120133
pub downloads: VersionLibraryDownloads,
@@ -124,36 +137,36 @@ pub struct VersionLibrary {
124137
}
125138

126139
#[derive(Deserialize, Serialize, Debug)]
127-
#[serde(rename_all = "camelCase")]
140+
#[serde(rename_all = "camelCase", deny_unknown_fields)]
128141
pub struct ManifestRule {
129142
pub action: String,
130143
pub os: Option<ManifestRuleOS>,
131144
pub features: Option<ManifestRuleFeatures>,
132145
}
133146

134147
#[derive(Deserialize, Serialize, Debug)]
135-
#[serde(rename_all = "camelCase")]
148+
#[serde(deny_unknown_fields)]
136149
pub struct ManifestRuleFeatures {
137150
pub is_demo_user: Option<bool>,
138151
pub has_custom_resolution: Option<bool>,
139152
}
140153

141154
#[derive(Deserialize, Serialize, Debug)]
142-
#[serde(rename_all = "camelCase")]
155+
#[serde(rename_all = "camelCase", deny_unknown_fields)]
143156
pub struct ManifestRuleOS {
144157
pub name: Option<String>,
145158
pub version: Option<String>,
146159
pub arch: Option<String>,
147160
}
148161

149162
#[derive(Deserialize, Serialize, Debug)]
150-
#[serde(rename_all = "camelCase")]
163+
#[serde(rename_all = "camelCase", deny_unknown_fields)]
151164
pub struct VersionLogging {
152165
pub client: VersionLoggingClient,
153166
}
154167

155168
#[derive(Deserialize, Serialize, Debug)]
156-
#[serde(rename_all = "camelCase")]
169+
#[serde(rename_all = "camelCase", deny_unknown_fields)]
157170
pub struct VersionLoggingClient {
158171
pub argument: String,
159172
pub file: VersionLoggingClientFile,
@@ -162,7 +175,7 @@ pub struct VersionLoggingClient {
162175
}
163176

164177
#[derive(Deserialize, Serialize, Debug)]
165-
#[serde(rename_all = "camelCase")]
178+
#[serde(rename_all = "camelCase", deny_unknown_fields)]
166179
pub struct VersionLoggingClientFile {
167180
pub id: String,
168181
pub sha1: String,
@@ -185,21 +198,21 @@ pub enum VersionArgumentValue {
185198
}
186199

187200
#[derive(Deserialize, Serialize, Debug)]
188-
#[serde(rename_all = "camelCase")]
201+
#[serde(rename_all = "camelCase", deny_unknown_fields)]
189202
pub struct VersionArgumentObject {
190203
pub rules: Vec<ManifestRule>,
191204
pub value: VersionArgumentValue,
192205
}
193206

194207
#[derive(Deserialize, Serialize, Debug)]
195-
#[serde(rename_all = "camelCase")]
208+
#[serde(rename_all = "camelCase", deny_unknown_fields)]
196209
pub struct VersionArguments {
197210
pub game: Vec<VersionArgument>,
198211
pub jvm: Vec<VersionArgument>,
199212
}
200213

201214
#[derive(Deserialize, Serialize, Debug)]
202-
#[serde(rename_all = "camelCase")]
215+
#[serde(rename_all = "camelCase", deny_unknown_fields)]
203216
pub struct MinecraftVersion {
204217
pub asset_index: AssetIndex,
205218
pub assets: String,

mcmeta/src/app_config.rs

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
use serde::Deserialize;
2+
3+
use crate::MetaMCError;
4+
5+
#[derive(Deserialize, Debug)]
6+
#[serde(rename_all = "snake_case", untagged)]
7+
pub enum StorageFormat {
8+
Json { meta_directory: String },
9+
Database,
10+
}
11+
12+
#[derive(Deserialize, Debug)]
13+
pub struct ServerConfig {
14+
pub bind_address: String,
15+
pub storage_format: StorageFormat,
16+
}
17+
18+
impl ServerConfig {
19+
pub fn from_config() -> Result<Self, MetaMCError> {
20+
let config = config::Config::builder()
21+
.add_source(config::Environment::with_prefix("MCMETA"))
22+
.set_default("bind_address", "127.0.0.1:8080")
23+
.unwrap()
24+
.set_default("storage_format", "json")
25+
.unwrap()
26+
.set_default("meta_directory", "meta")
27+
.unwrap()
28+
.build()?;
29+
30+
config.try_deserialize::<'_, Self>().map_err(Into::into)
31+
}
32+
}

0 commit comments

Comments
 (0)