Skip to content

Commit 1b924c3

Browse files
committed
refactor: move storage fuctions into submodules
Signed-off-by: Rachel Powers <[email protected]>
1 parent b7b1ee1 commit 1b924c3

File tree

4 files changed

+129
-134
lines changed

4 files changed

+129
-134
lines changed

mcmeta/src/routes/mojang.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use axum::{extract::Path, response::IntoResponse, Extension};
22
use libmcmeta::models::mojang::{MinecraftVersion, MojangVersionManifest};
3-
use std::{path::Path as StdPath, str::FromStr, sync::Arc};
3+
use std::sync::Arc;
44

55
use crate::app_config::{ServerConfig, StorageFormat};
66
use crate::routes::APIResponse;

mcmeta/src/storage.rs

Lines changed: 0 additions & 133 deletions
This file was deleted.

mcmeta/src/storage/mod.rs

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
use tracing::info;
2+
3+
use crate::{app_config::MetadataConfig, app_config::StorageFormat, errors::MetaMCError};
4+
5+
mod mojang;
6+
7+
impl StorageFormat {
8+
pub async fn initialize_metadata(
9+
&self,
10+
metadata_cfg: &MetadataConfig,
11+
) -> Result<(), MetaMCError> {
12+
match self {
13+
StorageFormat::Json { meta_directory } => {
14+
let metadata_dir = std::path::Path::new(meta_directory);
15+
if !metadata_dir.exists() {
16+
info!(
17+
"Metadata directory at {} does not exist, creating it",
18+
meta_directory
19+
);
20+
std::fs::create_dir_all(metadata_dir)?;
21+
}
22+
23+
mojang::initialize_mojang_metadata(&self, metadata_cfg).await?;
24+
}
25+
StorageFormat::Database => todo!(),
26+
}
27+
28+
Ok(())
29+
}
30+
}

mcmeta/src/storage/mojang.rs

Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
use futures::{stream, StreamExt};
2+
use libmcmeta::models::mojang::{MojangVersionManifest, MojangVersionManifestVersion};
3+
use tracing::{debug, info, warn};
4+
5+
use crate::{app_config::MetadataConfig, download, errors::MetaMCError, storage::StorageFormat};
6+
7+
pub async fn initialize_mojang_version_manifest(
8+
versions_dir: std::path::PathBuf,
9+
version: MojangVersionManifestVersion,
10+
) -> Result<(), MetaMCError> {
11+
let version_file = versions_dir.join(format!("{}.json", &version.id));
12+
if !version_file.exists() {
13+
info!(
14+
"Mojang metadata for version {} does not exist, downloading it",
15+
&version.id
16+
);
17+
let version_manifest = download::mojang::load_version_manifest(&version.url)
18+
.await
19+
.map_err(|err| {
20+
warn!(
21+
"Error parsing manifest for version {}: {}",
22+
&version.id,
23+
err.to_string()
24+
);
25+
err
26+
})?;
27+
let version_manifest_json = serde_json::to_string_pretty(&version_manifest)?;
28+
std::fs::write(&version_file, version_manifest_json)?;
29+
}
30+
Ok(())
31+
}
32+
33+
pub async fn initialize_mojang_metadata(
34+
storage_format: &StorageFormat,
35+
metadata_cfg: &MetadataConfig,
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");
42+
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+
}
50+
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)?;
57+
}
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)?;
68+
}
69+
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
93+
}
94+
StorageFormat::Database => todo!(),
95+
}
96+
97+
Ok(())
98+
}

0 commit comments

Comments
 (0)