Skip to content

Commit d96e940

Browse files
committed
refactor: split out json init form generic storage
Signed-off-by: Rachel Powers <[email protected]>
1 parent 1b924c3 commit d96e940

File tree

1 file changed

+61
-56
lines changed

1 file changed

+61
-56
lines changed

mcmeta/src/storage/mojang.rs

Lines changed: 61 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use tracing::{debug, info, warn};
44

55
use crate::{app_config::MetadataConfig, download, errors::MetaMCError, storage::StorageFormat};
66

7-
pub async fn initialize_mojang_version_manifest(
7+
pub async fn initialize_mojang_version_manifest_json(
88
versions_dir: std::path::PathBuf,
99
version: MojangVersionManifestVersion,
1010
) -> Result<(), MetaMCError> {
@@ -30,69 +30,74 @@ pub async fn initialize_mojang_version_manifest(
3030
Ok(())
3131
}
3232

33-
pub async fn initialize_mojang_metadata(
34-
storage_format: &StorageFormat,
33+
async fn initialize_mojang_metadata_json(
3534
metadata_cfg: &MetadataConfig,
35+
meta_directory: &str,
3636
) -> 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");
4239

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+
}
5047

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)
5780
}
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())
6884
}
85+
})
86+
.collect::<Vec<_>>()
87+
.await;
88+
results.into_iter().collect::<Result<Vec<_>, _>>()?;
89+
Ok(())
90+
}
6991

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
93100
}
94101
StorageFormat::Database => todo!(),
95102
}
96-
97-
Ok(())
98103
}

0 commit comments

Comments
 (0)