1
- use std:: { path:: Path as StdPath , str:: FromStr , sync:: Arc } ;
1
+ use std:: { str:: FromStr , sync:: Arc } ;
2
+
3
+ use app_config:: ServerConfig ;
4
+ use axum:: { routing:: get, Extension , Router } ;
2
5
3
- use app_config:: { ServerConfig , StorageFormat } ;
4
- use axum:: {
5
- extract:: { Path , Query } ,
6
- response:: IntoResponse ,
7
- routing:: get,
8
- Extension , Router ,
9
- } ;
10
- use custom_error:: custom_error;
11
- use libmcmeta:: models:: {
12
- forge:: {
13
- ForgeInstallerManifestVersion , ForgeMavenMetadata , ForgeMavenPromotions , ForgeVersion ,
14
- ForgeVersionMeta ,
15
- } ,
16
- mojang:: { MinecraftVersion , MojangVersionManifest } ,
17
- } ;
18
- use serde:: { Deserialize , Serialize } ;
19
- use serde_json:: json;
20
6
use tracing:: { debug, info} ;
21
7
8
+ use argparse:: { ArgumentParser , Store } ;
9
+ use dotenv:: dotenv;
10
+ use tracing_subscriber:: { filter, prelude:: * } ;
11
+
22
12
mod app_config;
23
13
mod download;
14
+ mod errors;
15
+ mod routes;
24
16
mod storage;
25
17
mod utils;
26
18
27
- custom_error ! { pub MetaMCError
28
- MojangMetadata { source: download:: errors:: MetadataError } = "Error while downloading metadata: {source}" ,
29
- Config { source: config:: ConfigError } = "Error while reading config from environment" ,
30
- Parse { source: std:: net:: AddrParseError } = "Error while parsing address: {source}" ,
31
- Hyper { source: hyper:: Error } = "Error while running Hyper: {source}" ,
32
- IO { source: std:: io:: Error } = "Error while reading or writing: {source}" ,
33
- Json { source: serde_json:: Error } = "Error while serializing or deserializing JSON: {source}" ,
34
- Join { source: tokio:: task:: JoinError } = "Thread join error: {source}" ,
35
- }
36
-
37
- #[ derive( Serialize , Debug , Clone ) ]
38
- pub struct APIResponse < T > {
39
- pub data : Option < T > ,
40
- pub error : Option < String > ,
41
- }
42
-
43
- async fn raw_mojang_manifest ( config : Extension < Arc < ServerConfig > > ) -> impl IntoResponse {
44
- match & config. storage_format {
45
- app_config:: StorageFormat :: Json { meta_directory } => {
46
- let metadata_dir = std:: path:: Path :: new ( meta_directory) ;
47
- let mojang_meta_dir = metadata_dir. join ( "mojang" ) ;
48
- let local_manifest = mojang_meta_dir. join ( "version_manifest_v2.json" ) ;
49
- let manifest = serde_json:: from_str :: < MojangVersionManifest > (
50
- & std:: fs:: read_to_string ( & local_manifest) . unwrap ( ) ,
51
- )
52
- . unwrap ( ) ;
53
-
54
- axum:: Json ( APIResponse {
55
- data : Some ( manifest) ,
56
- error : None ,
57
- } )
58
- }
59
- app_config:: StorageFormat :: Database => todo ! ( ) ,
60
- }
61
- }
62
-
63
- async fn raw_mojang_version (
64
- config : Extension < Arc < ServerConfig > > ,
65
- Path ( version) : Path < String > ,
66
- ) -> impl IntoResponse {
67
- match & config. storage_format {
68
- StorageFormat :: Json { meta_directory } => {
69
- let metadata_dir = std:: path:: Path :: new ( meta_directory) ;
70
- let mojang_meta_dir = metadata_dir. join ( "mojang" ) ;
71
- let versions_dir = mojang_meta_dir. join ( "versions" ) ;
72
- let version_file = versions_dir. join ( format ! ( "{}.json" , version) ) ;
73
- if !version_file. exists ( ) {
74
- return (
75
- axum:: http:: StatusCode :: NOT_FOUND ,
76
- axum:: Json ( APIResponse {
77
- data : None ,
78
- error : Some ( format ! ( "Version {} does not exist" , version) ) ,
79
- } ) ,
80
- ) ;
81
- }
82
- let manifest = serde_json:: from_str :: < MinecraftVersion > (
83
- & std:: fs:: read_to_string ( & version_file) . unwrap ( ) ,
84
- )
85
- . unwrap ( ) ;
86
-
87
- (
88
- axum:: http:: StatusCode :: OK ,
89
- axum:: Json ( APIResponse {
90
- data : Some ( manifest) ,
91
- error : None ,
92
- } ) ,
93
- )
94
- }
95
- StorageFormat :: Database => todo ! ( ) ,
96
- }
97
- }
98
-
99
- async fn raw_forge_maven_meta ( config : Extension < Arc < ServerConfig > > ) -> impl IntoResponse {
100
- match & config. storage_format {
101
- StorageFormat :: Json { meta_directory } => {
102
- let metadata_dir = std:: path:: Path :: new ( meta_directory) ;
103
- let forge_meta_dir = metadata_dir. join ( "forge" ) ;
104
- let maven_meta_file = forge_meta_dir. join ( "maven-metadata.json" ) ;
105
- let manifest = serde_json:: from_str :: < ForgeMavenMetadata > (
106
- & std:: fs:: read_to_string ( & maven_meta_file) . unwrap ( ) ,
107
- )
108
- . unwrap ( ) ;
109
-
110
- (
111
- axum:: http:: StatusCode :: OK ,
112
- axum:: Json ( APIResponse {
113
- data : Some ( manifest) ,
114
- error : None ,
115
- } ) ,
116
- )
117
- }
118
- StorageFormat :: Database => todo ! ( ) ,
119
- }
120
- }
121
-
122
- async fn raw_forge_promotions ( config : Extension < Arc < ServerConfig > > ) -> impl IntoResponse {
123
- match & config. storage_format {
124
- StorageFormat :: Json { meta_directory } => {
125
- let metadata_dir = std:: path:: Path :: new ( meta_directory) ;
126
- let forge_meta_dir = metadata_dir. join ( "forge" ) ;
127
- let promotions_file = forge_meta_dir. join ( "promotions_slim.json" ) ;
128
- let manifest = serde_json:: from_str :: < ForgeMavenPromotions > (
129
- & std:: fs:: read_to_string ( & promotions_file) . unwrap ( ) ,
130
- )
131
- . unwrap ( ) ;
132
-
133
- (
134
- axum:: http:: StatusCode :: OK ,
135
- axum:: Json ( APIResponse {
136
- data : Some ( manifest) ,
137
- error : None ,
138
- } ) ,
139
- )
140
- }
141
- StorageFormat :: Database => todo ! ( ) ,
142
- }
143
- }
144
-
145
- async fn raw_forge_version (
146
- config : Extension < Arc < ServerConfig > > ,
147
- Path ( version) : Path < String > ,
148
- ) -> impl IntoResponse {
149
- match & config. storage_format {
150
- StorageFormat :: Json { meta_directory } => {
151
- let metadata_dir = std:: path:: Path :: new ( meta_directory) ;
152
- let forge_meta_dir = metadata_dir. join ( "forge" ) ;
153
- let versions_dir = forge_meta_dir. join ( "version_manifests" ) ;
154
- let version_file = versions_dir. join ( format ! ( "{}.json" , version) ) ;
155
- if !version_file. exists ( ) {
156
- return (
157
- axum:: http:: StatusCode :: NOT_FOUND ,
158
- axum:: Json ( APIResponse {
159
- data : None ,
160
- error : Some ( format ! ( "Version {} does not exist" , version) ) ,
161
- } ) ,
162
- ) ;
163
- }
164
- let manifest = serde_json:: from_str :: < ForgeVersion > (
165
- & std:: fs:: read_to_string ( & version_file) . unwrap ( ) ,
166
- )
167
- . unwrap ( ) ;
168
-
169
- (
170
- axum:: http:: StatusCode :: OK ,
171
- axum:: Json ( APIResponse {
172
- data : Some ( manifest) ,
173
- error : None ,
174
- } ) ,
175
- )
176
- }
177
- StorageFormat :: Database => todo ! ( ) ,
178
- }
179
- }
180
-
181
- async fn raw_forge_version_meta (
182
- config : Extension < Arc < ServerConfig > > ,
183
- Path ( version) : Path < String > ,
184
- ) -> impl IntoResponse {
185
- match & config. storage_format {
186
- StorageFormat :: Json { meta_directory } => {
187
- let metadata_dir = std:: path:: Path :: new ( meta_directory) ;
188
- let forge_meta_dir = metadata_dir. join ( "forge" ) ;
189
- let versions_dir = forge_meta_dir. join ( "files_manifests" ) ;
190
- let version_file = versions_dir. join ( format ! ( "{}.json" , version) ) ;
191
- if !version_file. exists ( ) {
192
- return (
193
- axum:: http:: StatusCode :: NOT_FOUND ,
194
- axum:: Json ( APIResponse {
195
- data : None ,
196
- error : Some ( format ! ( "Version {} does not exist" , version) ) ,
197
- } ) ,
198
- ) ;
199
- }
200
- let manifest = serde_json:: from_str :: < ForgeVersionMeta > (
201
- & std:: fs:: read_to_string ( & version_file) . unwrap ( ) ,
202
- )
203
- . unwrap ( ) ;
204
-
205
- (
206
- axum:: http:: StatusCode :: OK ,
207
- axum:: Json ( APIResponse {
208
- data : Some ( manifest) ,
209
- error : None ,
210
- } ) ,
211
- )
212
- }
213
- StorageFormat :: Database => todo ! ( ) ,
214
- }
215
- }
216
-
217
- async fn raw_forge_version_installer (
218
- config : Extension < Arc < ServerConfig > > ,
219
- Path ( version) : Path < String > ,
220
- ) -> impl IntoResponse {
221
- match & config. storage_format {
222
- StorageFormat :: Json { meta_directory } => {
223
- let metadata_dir = std:: path:: Path :: new ( meta_directory) ;
224
- let forge_meta_dir = metadata_dir. join ( "forge" ) ;
225
- let versions_dir = forge_meta_dir. join ( "installer_manifests" ) ;
226
- let version_file = versions_dir. join ( format ! ( "{}.json" , version) ) ;
227
- if !version_file. exists ( ) {
228
- return (
229
- axum:: http:: StatusCode :: NOT_FOUND ,
230
- axum:: Json ( APIResponse {
231
- data : None ,
232
- error : Some ( format ! ( "Version {} does not exist" , version) ) ,
233
- } ) ,
234
- ) ;
235
- }
236
- let manifest = serde_json:: from_str :: < ForgeInstallerManifestVersion > (
237
- & std:: fs:: read_to_string ( & version_file) . unwrap ( ) ,
238
- )
239
- . unwrap ( ) ;
240
-
241
- (
242
- axum:: http:: StatusCode :: OK ,
243
- axum:: Json ( APIResponse {
244
- data : Some ( manifest) ,
245
- error : None ,
246
- } ) ,
247
- )
248
- }
249
- StorageFormat :: Database => todo ! ( ) ,
250
- }
251
- }
252
-
253
- use argparse:: { ArgumentParser , Store } ;
254
- use dotenv:: dotenv;
255
- use tracing_subscriber:: { filter, prelude:: * } ;
256
-
257
19
#[ tokio:: main]
258
- async fn main ( ) -> Result < ( ) , MetaMCError > {
20
+ async fn main ( ) -> Result < ( ) , errors :: MetaMCError > {
259
21
dotenv ( ) . ok ( ) ; // This line loads the environment variables from the ".env" file.
260
22
261
23
let mut config_path = "" . to_string ( ) ;
@@ -276,14 +38,13 @@ async fn main() -> Result<(), MetaMCError> {
276
38
let file_appender =
277
39
tracing_appender:: rolling:: hourly ( & config. debug_log . path , & config. debug_log . prefix ) ;
278
40
let ( non_blocking_file, _guard) = tracing_appender:: non_blocking ( file_appender) ;
279
- let stdout_log = tracing_subscriber:: fmt:: layer ( )
280
- . with_file ( true )
281
- . with_line_number ( true )
282
- . with_level ( true )
283
- . compact ( ) ;
41
+ let stdout_log = tracing_subscriber:: fmt:: layer ( ) . compact ( ) ;
284
42
285
43
let debug_log = tracing_subscriber:: fmt:: layer ( )
286
44
. with_ansi ( false )
45
+ . with_level ( true )
46
+ . with_file ( true )
47
+ . with_line_number ( true )
287
48
. with_writer ( non_blocking_file)
288
49
. with_filter ( filter:: LevelFilter :: from_level (
289
50
tracing:: Level :: from_str ( & config. debug_log . level ) . unwrap_or ( tracing:: Level :: DEBUG ) ,
@@ -308,14 +69,17 @@ async fn main() -> Result<(), MetaMCError> {
308
69
. await ?;
309
70
310
71
let raw_mojang_routes = Router :: new ( )
311
- . route ( "/" , get ( raw_mojang_manifest) )
312
- . route ( "/:version" , get ( raw_mojang_version) ) ;
72
+ . route ( "/" , get ( routes :: mojang :: raw_mojang_manifest) )
73
+ . route ( "/:version" , get ( routes :: mojang :: raw_mojang_version) ) ;
313
74
let raw_forge_routes = Router :: new ( )
314
- . route ( "/" , get ( raw_forge_maven_meta) )
315
- . route ( "/promotions" , get ( raw_forge_promotions) )
316
- . route ( "/:version" , get ( raw_forge_version) )
317
- . route ( "/:version/meta" , get ( raw_forge_version_meta) )
318
- . route ( "/:version/installer" , get ( raw_forge_version_installer) ) ;
75
+ . route ( "/" , get ( routes:: forge:: raw_forge_maven_meta) )
76
+ . route ( "/promotions" , get ( routes:: forge:: raw_forge_promotions) )
77
+ . route ( "/:version" , get ( routes:: forge:: raw_forge_version) )
78
+ . route ( "/:version/meta" , get ( routes:: forge:: raw_forge_version_meta) )
79
+ . route (
80
+ "/:version/installer" ,
81
+ get ( routes:: forge:: raw_forge_version_installer) ,
82
+ ) ;
319
83
320
84
let raw_routes = Router :: new ( )
321
85
. nest ( "/mojang" , raw_mojang_routes)
0 commit comments