|
| 1 | +use crate::models::merge::{self, Merge}; |
| 2 | + |
1 | 3 | use serde::{Deserialize, Serialize};
|
2 | 4 | use serde_valid::Validate;
|
3 | 5 | use serde_with::skip_serializing_none;
|
@@ -302,6 +304,71 @@ pub enum ForgeInstallerManifestVersion {
|
302 | 304 | Modern(Box<ForgeInstallerManifest>),
|
303 | 305 | }
|
304 | 306 |
|
| 307 | +#[derive(Deserialize, Serialize, Clone, Debug, Validate, Merge)] |
| 308 | +pub struct ForgeFile { |
| 309 | + #[merge(strategy = merge::overwrite)] |
| 310 | + pub classifier: String, |
| 311 | + #[merge(strategy = merge::overwrite)] |
| 312 | + pub hash: String, |
| 313 | + #[merge(strategy = merge::overwrite)] |
| 314 | + pub extension: String, |
| 315 | +} |
| 316 | + |
| 317 | +impl ForgeFile { |
| 318 | + fn filename(&self, long_version: &str) -> String { |
| 319 | + format!( |
| 320 | + "{}-{}-{}.{}", |
| 321 | + "forge", long_version, self.classifier, self.extension |
| 322 | + ) |
| 323 | + } |
| 324 | + |
| 325 | + fn url(&self, long_version: &str) -> String { |
| 326 | + format!( |
| 327 | + "https://maven.minecraftforge.net/net/minecraftforge/forge/{}/{}", |
| 328 | + long_version, |
| 329 | + self.filename(long_version), |
| 330 | + ) |
| 331 | + } |
| 332 | +} |
| 333 | + |
| 334 | +#[skip_serializing_none] |
| 335 | +#[derive(Deserialize, Serialize, Clone, Debug, Validate, Merge)] |
| 336 | +pub struct ForgeEntry { |
| 337 | + #[serde(rename = "longversion")] |
| 338 | + #[merge(strategy = merge::overwrite)] |
| 339 | + pub long_version: String, |
| 340 | + #[serde(rename = "mcversion")] |
| 341 | + #[merge(strategy = merge::overwrite)] |
| 342 | + pub mc_version: String, |
| 343 | + #[merge(strategy = merge::overwrite)] |
| 344 | + pub version: String, |
| 345 | + #[merge(strategy = merge::overwrite)] |
| 346 | + pub build: i64, |
| 347 | + pub branch: Option<String>, |
| 348 | + pub latest: Option<bool>, |
| 349 | + pub recommended: Option<bool>, |
| 350 | + #[merge(strategy = merge::hashmap::recurse_some)] |
| 351 | + pub files: Option<HashMap<String, ForgeFile>>, |
| 352 | +} |
| 353 | + |
| 354 | +#[skip_serializing_none] |
| 355 | +#[derive(Deserialize, Serialize, Clone, Debug, Validate, Merge)] |
| 356 | +pub struct ForgeMCVersionInfo { |
| 357 | + pub latest: Option<String>, |
| 358 | + pub recommended: Option<String>, |
| 359 | + #[merge(strategy = merge::vec::append)] |
| 360 | + pub versions: Vec<String>, |
| 361 | +} |
| 362 | + |
| 363 | +#[derive(Deserialize, Serialize, Clone, Debug, Validate, Merge)] |
| 364 | +pub struct DerivedForgeIndex { |
| 365 | + #[merge(strategy = merge::hashmap::recurse)] |
| 366 | + pub versions: HashMap<String, ForgeEntry>, |
| 367 | + #[serde(rename = "by_mcversion")] |
| 368 | + #[merge(strategy = merge::hashmap::recurse)] |
| 369 | + pub by_mc_version: HashMap<String, ForgeMCVersionInfo>, |
| 370 | +} |
| 371 | + |
305 | 372 | #[cfg(test)]
|
306 | 373 | mod tests {
|
307 | 374 | #[test]
|
|
0 commit comments