Skip to content

Commit ef9e6a9

Browse files
committed
feat: inital forge version processing
Signed-off-by: Rachel Powers <[email protected]>
1 parent 45ecac3 commit ef9e6a9

File tree

5 files changed

+770
-125
lines changed

5 files changed

+770
-125
lines changed

libmcmeta/src/models/forge.rs

Lines changed: 193 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,69 @@ pub struct ForgeVersionClassifier {
3232
pub stash: Option<String>,
3333
}
3434

35+
pub enum ForgeVersionClassifierExtensions {
36+
Txt,
37+
Zip,
38+
Jar,
39+
Stash,
40+
}
41+
42+
impl ForgeVersionClassifierExtensions {
43+
pub fn as_str(&self) -> &'static str {
44+
match self {
45+
ForgeVersionClassifierExtensions::Txt => "txt",
46+
ForgeVersionClassifierExtensions::Zip => "zip",
47+
ForgeVersionClassifierExtensions::Jar => "jar",
48+
ForgeVersionClassifierExtensions::Stash => "stash",
49+
}
50+
}
51+
}
52+
53+
pub struct ForgeVersionClassifierIter<'a> {
54+
classifier: &'a ForgeVersionClassifier,
55+
index: usize,
56+
}
57+
58+
impl ForgeVersionClassifier {
59+
pub fn iter(&self) -> ForgeVersionClassifierIter<'_> {
60+
ForgeVersionClassifierIter {
61+
classifier: &self,
62+
index: 0,
63+
}
64+
}
65+
}
66+
67+
impl<'a> Iterator for ForgeVersionClassifierIter<'a> {
68+
type Item = (ForgeVersionClassifierExtensions, &'a Option<String>);
69+
70+
fn next(&mut self) -> Option<Self::Item> {
71+
let result = match self.index {
72+
0 => (ForgeVersionClassifierExtensions::Txt, &self.classifier.txt),
73+
1 => (ForgeVersionClassifierExtensions::Zip, &self.classifier.zip),
74+
2 => (ForgeVersionClassifierExtensions::Jar, &self.classifier.jar),
75+
3 => (
76+
ForgeVersionClassifierExtensions::Stash,
77+
&self.classifier.stash,
78+
),
79+
_ => return None,
80+
};
81+
self.index += 1;
82+
Some(result)
83+
}
84+
}
85+
86+
impl<'a> IntoIterator for &'a ForgeVersionClassifier {
87+
type Item = (ForgeVersionClassifierExtensions, &'a Option<String>);
88+
type IntoIter = ForgeVersionClassifierIter<'a>;
89+
90+
fn into_iter(self) -> Self::IntoIter {
91+
ForgeVersionClassifierIter {
92+
classifier: &self,
93+
index: 0,
94+
}
95+
}
96+
}
97+
3598
#[derive(Deserialize, Serialize, Clone, Debug, Validate)]
3699
#[skip_serializing_none]
37100
#[serde(deny_unknown_fields)]
@@ -52,6 +115,132 @@ pub struct ForgeVersionClassifiers {
52115
pub src_zip: Option<ForgeVersionClassifier>,
53116
}
54117

118+
pub enum ForgeVersionClassifierNames {
119+
Changelog,
120+
Installer,
121+
Mdk,
122+
Universal,
123+
Userdev,
124+
Sources,
125+
Javadoc,
126+
Client,
127+
Src,
128+
Server,
129+
Launcher,
130+
Userdev3,
131+
SrcZip,
132+
}
133+
134+
impl ForgeVersionClassifierNames {
135+
pub fn as_str(&self) -> &'static str {
136+
match self {
137+
ForgeVersionClassifierNames::Changelog => "changelog",
138+
ForgeVersionClassifierNames::Installer => "installer",
139+
ForgeVersionClassifierNames::Mdk => "mdk",
140+
ForgeVersionClassifierNames::Universal => "universal",
141+
ForgeVersionClassifierNames::Userdev => "userdev",
142+
ForgeVersionClassifierNames::Sources => "sources",
143+
ForgeVersionClassifierNames::Javadoc => "javadoc",
144+
ForgeVersionClassifierNames::Client => "client",
145+
ForgeVersionClassifierNames::Src => "src",
146+
ForgeVersionClassifierNames::Server => "server",
147+
ForgeVersionClassifierNames::Launcher => "launcher",
148+
ForgeVersionClassifierNames::Userdev3 => "userdev3",
149+
ForgeVersionClassifierNames::SrcZip => "src.zip",
150+
}
151+
}
152+
}
153+
154+
pub struct ForgeVersionClassifiersIter<'a> {
155+
classifiers: &'a ForgeVersionClassifiers,
156+
index: usize,
157+
}
158+
159+
impl ForgeVersionClassifiers {
160+
pub fn iter(&self) -> ForgeVersionClassifiersIter<'_> {
161+
ForgeVersionClassifiersIter {
162+
classifiers: &self,
163+
index: 0,
164+
}
165+
}
166+
}
167+
168+
impl<'a> IntoIterator for &'a ForgeVersionClassifiers {
169+
type Item = (
170+
ForgeVersionClassifierNames,
171+
&'a Option<ForgeVersionClassifier>,
172+
);
173+
type IntoIter = ForgeVersionClassifiersIter<'a>;
174+
175+
fn into_iter(self) -> Self::IntoIter {
176+
ForgeVersionClassifiersIter {
177+
classifiers: &self,
178+
index: 0,
179+
}
180+
}
181+
}
182+
183+
impl<'a> Iterator for ForgeVersionClassifiersIter<'a> {
184+
type Item = (
185+
ForgeVersionClassifierNames,
186+
&'a Option<ForgeVersionClassifier>,
187+
);
188+
189+
fn next(&mut self) -> Option<Self::Item> {
190+
let result = match self.index {
191+
0 => (
192+
ForgeVersionClassifierNames::Changelog,
193+
&self.classifiers.changelog,
194+
),
195+
1 => (
196+
ForgeVersionClassifierNames::Installer,
197+
&self.classifiers.installer,
198+
),
199+
2 => (ForgeVersionClassifierNames::Mdk, &self.classifiers.mdk),
200+
3 => (
201+
ForgeVersionClassifierNames::Universal,
202+
&self.classifiers.universal,
203+
),
204+
4 => (
205+
ForgeVersionClassifierNames::Userdev,
206+
&self.classifiers.userdev,
207+
),
208+
5 => (
209+
ForgeVersionClassifierNames::Sources,
210+
&self.classifiers.sources,
211+
),
212+
6 => (
213+
ForgeVersionClassifierNames::Javadoc,
214+
&self.classifiers.javadoc,
215+
),
216+
7 => (
217+
ForgeVersionClassifierNames::Client,
218+
&self.classifiers.client,
219+
),
220+
8 => (ForgeVersionClassifierNames::Src, &self.classifiers.src),
221+
9 => (
222+
ForgeVersionClassifierNames::Server,
223+
&self.classifiers.server,
224+
),
225+
10 => (
226+
ForgeVersionClassifierNames::Launcher,
227+
&self.classifiers.launcher,
228+
),
229+
11 => (
230+
ForgeVersionClassifierNames::Userdev3,
231+
&self.classifiers.userdev3,
232+
),
233+
12 => (
234+
ForgeVersionClassifierNames::SrcZip,
235+
&self.classifiers.src_zip,
236+
),
237+
_ => return None,
238+
};
239+
self.index += 1;
240+
Some(result)
241+
}
242+
}
243+
55244
#[derive(Deserialize, Serialize, Clone, Debug, Validate)]
56245
#[skip_serializing_none]
57246
#[serde(deny_unknown_fields)]
@@ -332,7 +521,7 @@ impl ForgeFile {
332521
}
333522

334523
#[skip_serializing_none]
335-
#[derive(Deserialize, Serialize, Clone, Debug, Validate, Merge)]
524+
#[derive(Deserialize, Serialize, Clone, Debug, Validate, Merge, Default)]
336525
pub struct ForgeEntry {
337526
#[serde(rename = "longversion")]
338527
#[merge(strategy = merge::overwrite)]
@@ -343,7 +532,7 @@ pub struct ForgeEntry {
343532
#[merge(strategy = merge::overwrite)]
344533
pub version: String,
345534
#[merge(strategy = merge::overwrite)]
346-
pub build: i64,
535+
pub build: i32,
347536
pub branch: Option<String>,
348537
pub latest: Option<bool>,
349538
pub recommended: Option<bool>,
@@ -352,15 +541,15 @@ pub struct ForgeEntry {
352541
}
353542

354543
#[skip_serializing_none]
355-
#[derive(Deserialize, Serialize, Clone, Debug, Validate, Merge)]
544+
#[derive(Deserialize, Serialize, Clone, Debug, Validate, Merge, Default)]
356545
pub struct ForgeMCVersionInfo {
357546
pub latest: Option<String>,
358547
pub recommended: Option<String>,
359548
#[merge(strategy = merge::vec::append)]
360549
pub versions: Vec<String>,
361550
}
362551

363-
#[derive(Deserialize, Serialize, Clone, Debug, Validate, Merge)]
552+
#[derive(Deserialize, Serialize, Clone, Debug, Validate, Merge, Default)]
364553
pub struct DerivedForgeIndex {
365554
#[merge(strategy = merge::hashmap::recurse)]
366555
pub versions: HashMap<String, ForgeEntry>,

mcmeta/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ futures = "0.3.28"
1616
git2 = "0.17.0"
1717
hyper = "0.14.25"
1818
libmcmeta = { path = "../libmcmeta" }
19+
regex = "1.7.3"
1920
reqwest = { version = "0.11.16", features = ["json"] }
2021
serde = { version = "1.0.160", features = ["derive"] }
2122
serde_json = "1.0.95"

mcmeta/src/download/forge.rs

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use libmcmeta::models::forge::{ForgeMavenMetadata, ForgeMavenPromotions};
1+
use libmcmeta::models::forge::{ForgeMavenMetadata, ForgeMavenPromotions, ForgeVersionMeta};
22
use serde::Deserialize;
33
use serde_valid::Validate;
44
use tracing::debug;
@@ -68,3 +68,19 @@ pub async fn load_maven_promotions() -> Result<ForgeMavenPromotions> {
6868
promotions.validate()?;
6969
Ok(promotions)
7070
}
71+
72+
pub async fn load_single_forge_files_manifest(url: &str) -> Result<ForgeVersionMeta> {
73+
let client = reqwest::Client::new();
74+
75+
let body = client
76+
.get(url)
77+
.send()
78+
.await?
79+
.error_for_status()?
80+
.text()
81+
.await?;
82+
let manifest: ForgeVersionMeta =
83+
serde_json::from_str(&body).map_err(|err| MetadataError::from_json_err(err, &body))?;
84+
manifest.validate()?;
85+
Ok(manifest)
86+
}

0 commit comments

Comments
 (0)