Skip to content

Commit b7b1ee1

Browse files
committed
refactor: create route module
Signed-off-by: Rachel Powers <[email protected]>
1 parent c1c71d4 commit b7b1ee1

File tree

7 files changed

+277
-263
lines changed

7 files changed

+277
-263
lines changed

mcmeta/src/app_config.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use serde::Deserialize;
22

3-
use crate::MetaMCError;
3+
use crate::errors::MetaMCError;
44

55
#[derive(Deserialize, Debug)]
66
#[serde(rename_all = "snake_case", tag = "type")]

mcmeta/src/errors.rs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
use crate::download::errors::MetadataError;
2+
use custom_error::custom_error;
3+
4+
custom_error! {
5+
pub MetaMCError
6+
MojangMetadata { source: MetadataError } = "Error while downloading metadata: {source}",
7+
Config { source: config::ConfigError } = "Error while reading config from environment",
8+
Parse { source: std::net::AddrParseError } = "Error while parsing address: {source}",
9+
Hyper { source: hyper::Error } = "Error while running Hyper: {source}",
10+
IO { source: std::io::Error } = "Error while reading or writing: {source}",
11+
Json { source: serde_json::Error } = "Error while serializing or deserializing JSON: {source}",
12+
Join { source: tokio::task::JoinError } = "Thread join error: {source}",
13+
}

mcmeta/src/main.rs

Lines changed: 25 additions & 261 deletions
Original file line numberDiff line numberDiff line change
@@ -1,261 +1,23 @@
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};
25

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;
206
use tracing::{debug, info};
217

8+
use argparse::{ArgumentParser, Store};
9+
use dotenv::dotenv;
10+
use tracing_subscriber::{filter, prelude::*};
11+
2212
mod app_config;
2313
mod download;
14+
mod errors;
15+
mod routes;
2416
mod storage;
2517
mod utils;
2618

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-
25719
#[tokio::main]
258-
async fn main() -> Result<(), MetaMCError> {
20+
async fn main() -> Result<(), errors::MetaMCError> {
25921
dotenv().ok(); // This line loads the environment variables from the ".env" file.
26022

26123
let mut config_path = "".to_string();
@@ -276,14 +38,13 @@ async fn main() -> Result<(), MetaMCError> {
27638
let file_appender =
27739
tracing_appender::rolling::hourly(&config.debug_log.path, &config.debug_log.prefix);
27840
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();
28442

28543
let debug_log = tracing_subscriber::fmt::layer()
28644
.with_ansi(false)
45+
.with_level(true)
46+
.with_file(true)
47+
.with_line_number(true)
28748
.with_writer(non_blocking_file)
28849
.with_filter(filter::LevelFilter::from_level(
28950
tracing::Level::from_str(&config.debug_log.level).unwrap_or(tracing::Level::DEBUG),
@@ -308,14 +69,17 @@ async fn main() -> Result<(), MetaMCError> {
30869
.await?;
30970

31071
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));
31374
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+
);
31983

32084
let raw_routes = Router::new()
32185
.nest("/mojang", raw_mojang_routes)

0 commit comments

Comments
 (0)