@@ -4,7 +4,7 @@ use tracing::{debug, info, warn};
4
4
5
5
use crate :: { app_config:: MetadataConfig , download, errors:: MetaMCError , storage:: StorageFormat } ;
6
6
7
- pub async fn initialize_mojang_version_manifest (
7
+ pub async fn initialize_mojang_version_manifest_json (
8
8
versions_dir : std:: path:: PathBuf ,
9
9
version : MojangVersionManifestVersion ,
10
10
) -> Result < ( ) , MetaMCError > {
@@ -30,69 +30,74 @@ pub async fn initialize_mojang_version_manifest(
30
30
Ok ( ( ) )
31
31
}
32
32
33
- pub async fn initialize_mojang_metadata (
34
- storage_format : & StorageFormat ,
33
+ async fn initialize_mojang_metadata_json (
35
34
metadata_cfg : & MetadataConfig ,
35
+ meta_directory : & str ,
36
36
) -> Result < ( ) , MetaMCError > {
37
- match storage_format {
38
- StorageFormat :: Json { meta_directory } => {
39
- info ! ( "Checking for Mojang metadata" ) ;
40
- let metadata_dir = std:: path:: Path :: new ( meta_directory) ;
41
- let mojang_meta_dir = metadata_dir. join ( "mojang" ) ;
37
+ let metadata_dir = std:: path:: Path :: new ( meta_directory) ;
38
+ let mojang_meta_dir = metadata_dir. join ( "mojang" ) ;
42
39
43
- if !mojang_meta_dir. exists ( ) {
44
- info ! (
45
- "Mojang metadata directory at {} does not exist, creating it" ,
46
- mojang_meta_dir. display( )
47
- ) ;
48
- std:: fs:: create_dir_all ( & mojang_meta_dir) ?;
49
- }
40
+ if !mojang_meta_dir. exists ( ) {
41
+ info ! (
42
+ "Mojang metadata directory at {} does not exist, creating it" ,
43
+ mojang_meta_dir. display( )
44
+ ) ;
45
+ std:: fs:: create_dir_all ( & mojang_meta_dir) ?;
46
+ }
50
47
51
- let local_manifest = mojang_meta_dir. join ( "version_manifest_v2.json" ) ;
52
- if !local_manifest. exists ( ) {
53
- info ! ( "Mojang metadata does not exist, downloading it" ) ;
54
- let manifest = download:: mojang:: load_manifest ( ) . await ?;
55
- let manifest_json = serde_json:: to_string_pretty ( & manifest) ?;
56
- std:: fs:: write ( & local_manifest, manifest_json) ?;
48
+ let local_manifest = mojang_meta_dir. join ( "version_manifest_v2.json" ) ;
49
+ if !local_manifest. exists ( ) {
50
+ info ! ( "Mojang metadata does not exist, downloading it" ) ;
51
+ let manifest = download:: mojang:: load_manifest ( ) . await ?;
52
+ let manifest_json = serde_json:: to_string_pretty ( & manifest) ?;
53
+ std:: fs:: write ( & local_manifest, manifest_json) ?;
54
+ }
55
+ let manifest =
56
+ serde_json:: from_str :: < MojangVersionManifest > ( & std:: fs:: read_to_string ( & local_manifest) ?) ?;
57
+ let versions_dir = mojang_meta_dir. join ( "versions" ) ;
58
+ if !versions_dir. exists ( ) {
59
+ info ! (
60
+ "Mojang versions directory at {} does not exist, creating it" ,
61
+ versions_dir. display( )
62
+ ) ;
63
+ std:: fs:: create_dir_all ( & versions_dir) ?;
64
+ }
65
+
66
+ let versions = manifest. versions ;
67
+ let tasks = stream:: iter ( versions)
68
+ . map ( |version| {
69
+ let v = version. clone ( ) ;
70
+ let dir = versions_dir. clone ( ) ;
71
+ tokio:: spawn ( async move { initialize_mojang_version_manifest_json ( dir, v) . await } )
72
+ } )
73
+ . buffer_unordered ( metadata_cfg. max_parallel_fetch_connections ) ;
74
+ let results = tasks
75
+ . map ( |t| match t {
76
+ Ok ( Ok ( t) ) => Ok ( t) ,
77
+ Ok ( Err ( e) ) => {
78
+ debug ! ( "Task had an error: {:?}" , e) ;
79
+ Err ( e)
57
80
}
58
- let manifest = serde_json:: from_str :: < MojangVersionManifest > (
59
- & std:: fs:: read_to_string ( & local_manifest) ?,
60
- ) ?;
61
- let versions_dir = mojang_meta_dir. join ( "versions" ) ;
62
- if !versions_dir. exists ( ) {
63
- info ! (
64
- "Mojang versions directory at {} does not exist, creating it" ,
65
- versions_dir. display( )
66
- ) ;
67
- std:: fs:: create_dir_all ( & versions_dir) ?;
81
+ Err ( e) => {
82
+ debug ! ( "Task had a Join error: {:?}" , e) ;
83
+ Err ( e. into ( ) )
68
84
}
85
+ } )
86
+ . collect :: < Vec < _ > > ( )
87
+ . await ;
88
+ results. into_iter ( ) . collect :: < Result < Vec < _ > , _ > > ( ) ?;
89
+ Ok ( ( ) )
90
+ }
69
91
70
- let versions = manifest. versions ;
71
- let tasks = stream:: iter ( versions)
72
- . map ( |version| {
73
- let v = version. clone ( ) ;
74
- let dir = versions_dir. clone ( ) ;
75
- tokio:: spawn ( async move { initialize_mojang_version_manifest ( dir, v) . await } )
76
- } )
77
- . buffer_unordered ( metadata_cfg. max_parallel_fetch_connections ) ;
78
- tasks
79
- . map ( |t| async {
80
- match t {
81
- Ok ( Ok ( t) ) => Ok ( t) ,
82
- Ok ( Err ( e) ) => Err ( e) ,
83
- Err ( e) => Err ( e. into ( ) ) ,
84
- }
85
- } )
86
- . for_each ( |t| async {
87
- match t. await {
88
- Ok ( _) => { }
89
- Err ( e) => debug ! ( "Task had an error: {:?}" , e) ,
90
- }
91
- } )
92
- . await
92
+ pub async fn initialize_mojang_metadata (
93
+ storage_format : & StorageFormat ,
94
+ metadata_cfg : & MetadataConfig ,
95
+ ) -> Result < ( ) , MetaMCError > {
96
+ info ! ( "Checking for Mojang metadata" ) ;
97
+ match storage_format {
98
+ StorageFormat :: Json { meta_directory } => {
99
+ return initialize_mojang_metadata_json ( metadata_cfg, meta_directory) . await
93
100
}
94
101
StorageFormat :: Database => todo ! ( ) ,
95
102
}
96
-
97
- Ok ( ( ) )
98
103
}
0 commit comments