1
- use std:: { collections:: HashMap , fmt:: Debug } ;
1
+ use std:: { collections:: HashMap , fmt:: Debug , slice :: Iter } ;
2
2
3
3
use anyhow:: anyhow;
4
4
use itertools:: Itertools ;
5
5
use serde:: { Deserialize , Serialize } ;
6
6
7
+ use crate :: {
8
+ downloads:: {
9
+ progress:: ProgressSender ,
10
+ traits:: { DownloadResult , Downloader } ,
11
+ } ,
12
+ PinnedFutureWithBounds ,
13
+ } ;
14
+
7
15
const FORGE_REPO_URL : & str = "https://maven.minecraftforge.net" ;
8
16
const FORGE_GROUP : & str = "net.minecraftforge" ;
9
17
const FORGE_ARTIFACT : & str = "forge" ;
@@ -12,8 +20,25 @@ const NEO_FORGE_REPO_URL: &str = "https://maven.neoforged.net/releases/";
12
20
const NEO_FORGE_GROUP : & str = "net.neoforged" ;
13
21
const NEO_FORGE_ARTIFACT : & str = "neoforge" ;
14
22
23
+ /// Some versions require to have a suffix
24
+ const FORGE_SUFFIXES : & [ ( & str , & [ & str ] ) ] = & [
25
+ ( "1.11" , & [ "-1.11.x" ] ) ,
26
+ ( "1.10.2" , & [ "-1.10.0" ] ) ,
27
+ ( "1.10" , & [ "-1.10.0" ] ) ,
28
+ ( "1.9.4" , & [ "-1.9.4" ] ) ,
29
+ ( "1.9" , & [ "-1.9.0" , "-1.9" ] ) ,
30
+ ( "1.8.9" , & [ "-1.8.9" ] ) ,
31
+ ( "1.8.8" , & [ "-1.8.8" ] ) ,
32
+ ( "1.8" , & [ "-1.8" ] ) ,
33
+ ( "1.7.10" , & [ "-1.7.10" , "-1710ls" , "-new" ] ) ,
34
+ ( "1.7.2" , & [ "-mc172" ] ) ,
35
+ ] ;
36
+
37
+ #[ derive( Debug ) ]
15
38
pub struct Forge {
16
- url : String ,
39
+ urls : Vec < String > ,
40
+ game_version : String ,
41
+ forge_version : String ,
17
42
}
18
43
19
44
impl Forge {
@@ -26,6 +51,7 @@ impl Forge {
26
51
. text ( )
27
52
. await ?;
28
53
54
+ // Parsing the XML to get versions list
29
55
let versions = raw
30
56
. find ( "<version>" )
31
57
. and_then ( |s| raw. find ( "</versions>" ) . map ( |e| ( s, e) ) )
@@ -50,6 +76,7 @@ impl Forge {
50
76
}
51
77
}
52
78
79
+ /// Get forge versions that are recommended for specific game version
53
80
pub async fn get_promo_versions ( ) -> anyhow:: Result < ForgeVersions > {
54
81
reqwest:: get ( "https://files.minecraftforge.net/net/minecraftforge/forge/promotions_slim.json" )
55
82
. await ?
@@ -67,6 +94,7 @@ impl Forge {
67
94
let promo_versions = Self :: get_promo_versions ( ) . await ?;
68
95
69
96
let from_promo = |version| {
97
+ // Sometime one of those does not exist so we have a fallback.
70
98
let next_version = match version {
71
99
ForgeVersion :: Recommended => ForgeVersion :: Latest ,
72
100
ForgeVersion :: Latest => ForgeVersion :: Recommended ,
@@ -86,13 +114,43 @@ impl Forge {
86
114
version => from_promo ( version) ,
87
115
} ;
88
116
89
- let Some ( spesific_version ) = opt else {
117
+ let Some ( ForgeVersion :: Specific ( forge_version ) ) = opt else {
90
118
return Err ( anyhow ! ( "Cannot match version" ) ) ;
91
119
} ;
92
120
93
- dbg ! ( & spesific_version ) ;
121
+ let mut suffixes = vec ! [ "" ] ;
94
122
95
- Err ( anyhow ! ( "not yet implemented" ) )
123
+ if let Some ( ( _, s) ) = FORGE_SUFFIXES . iter ( ) . find ( |( k, _) | k == & game_version) {
124
+ suffixes. extend ( s. iter ( ) ) ;
125
+ }
126
+
127
+ // Make list of urls that we should try to get installer from
128
+ let urls = suffixes. into_iter ( ) . map ( |suffix| {
129
+ format ! (
130
+ "{FORGE_REPO_URL}/net/minecraftforge/forge/{game_version}-{forge_version}{suffix}/forge-{game_version}-{forge_version}{suffix}-installer.jar" ,
131
+ )
132
+ } ) . collect_vec ( ) ;
133
+
134
+ Ok ( Self {
135
+ urls,
136
+ game_version,
137
+ forge_version,
138
+ } )
139
+ }
140
+ }
141
+
142
+ #[ async_trait:: async_trait]
143
+ impl Downloader for Forge {
144
+ type Data = DownloadResult ;
145
+
146
+ fn total ( & self ) -> u32 {
147
+ 1
148
+ }
149
+
150
+ async fn download ( self : Box < Self > , sender : & dyn ProgressSender < Self :: Data > ) { }
151
+
152
+ fn io ( & self ) -> PinnedFutureWithBounds < anyhow:: Result < ( ) > > {
153
+ todo ! ( ) ;
96
154
}
97
155
}
98
156
@@ -129,13 +187,16 @@ mod tests {
129
187
130
188
#[ tokio:: test]
131
189
async fn get_versions_test ( ) {
132
- let versions = Forge :: get_versions ( "1.19.2 " ) . await . unwrap ( ) ;
190
+ let versions = Forge :: get_versions ( "1.7.10 " ) . await . unwrap ( ) ;
133
191
println ! ( "{versions:#?}" ) ;
134
192
}
135
193
136
194
#[ tokio:: test]
137
195
async fn create_forge_test ( ) {
138
- let _recommended = Forge :: new ( "1.19.2" , ForgeVersion :: Recommended ) . await ;
139
- let _latest = Forge :: new ( "1.19.2" , ForgeVersion :: Latest ) . await ;
196
+ let recommended = Forge :: new ( "1.7.10" , ForgeVersion :: Recommended ) . await . unwrap ( ) ;
197
+ println ! ( "{recommended:#?}" ) ;
198
+
199
+ let latest = Forge :: new ( "1.19.2" , ForgeVersion :: Latest ) . await . unwrap ( ) ;
200
+ println ! ( "{latest:#?}" ) ;
140
201
}
141
202
}
0 commit comments