Skip to content

Commit b770a2e

Browse files
committed
chore: Update dependencies and rust edition
- Bump Rust edition from 2021 to 2024 in Cargo.toml - Update dependencies: - Change bson and mongodb versions to 3.0.0 and 3.3.0 respectively - Replace bson's chrono features with serde_with for better datetime handling - Refactor imports for consistency across modules - Simplify async function signatures in Redis and MongoDB connection functions - Update error handling in services to use more concise patterns - Improve formatting and readability in various structs and implementations - Ensure all modules use the latest serde_with features for datetime serialization
1 parent 2a4881a commit b770a2e

29 files changed

+499
-466
lines changed

Cargo.lock

Lines changed: 284 additions & 269 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,17 @@
11
[package]
22
name = "mcim-rust-api"
33
version = "0.1.0"
4-
edition = "2021"
4+
edition = "2024"
55
authors = ["[email protected]"]
66
description = "MCIM API rewritten in Rust"
77

88
[dependencies]
99
actix-web = "4"
1010
serde = { version = "1.0", features = ["derive"] }
1111
serde_json = "1.0"
12-
bson = { version = "2.15", features = ["chrono-0_4"] }
13-
mongodb = { version = "3.2.4" }
12+
serde_with = { version = "3.14.0", features = ["chrono_0_4"] }
13+
bson = { version = "3.0.0", features = ["chrono-0_4", "serde_with-3", "serde"] }
14+
mongodb = { version = "3.3.0" , features = ["bson-3"] }
1415
chrono = { version = "0.4.41", features = ["serde"] }
1516
futures = "0.3.31"
1617
utoipa = { version = "5.4.0", features = ["actix_extras", "chrono"] }
@@ -34,4 +35,4 @@ prometheus = "0.14.0"
3435
tokio = { version = "1.47.0", features = ["full"] }
3536

3637
[build-dependencies]
37-
chrono = { version = "0.4.41", features = ["serde"] }
38+
chrono = { version = "0.4.41", features = ["serde"] }

build.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,4 +47,4 @@ fn main() {
4747
// 当 git 变化时重新构建
4848
println!("cargo:rerun-if-changed=.git/HEAD");
4949
println!("cargo:rerun-if-changed=.git/index");
50-
}
50+
}

src/db/_redis.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
1-
use redis::{aio::MultiplexedConnection, Client};
1+
use redis::{Client, aio::MultiplexedConnection};
22
use std::env;
33
use std::sync::Arc;
44

5-
pub async fn connect(
6-
) -> Result<Arc<MultiplexedConnection>, Box<dyn std::error::Error + Send + Sync>> {
5+
pub async fn connect()
6+
-> Result<Arc<MultiplexedConnection>, Box<dyn std::error::Error + Send + Sync>> {
77
let redis_url = env::var("REDIS_URL").unwrap_or_else(|_| "redis://localhost:6379".to_string());
88

99
let client = Client::open(redis_url)?;

src/db/database.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use mongodb::{options::ClientOptions, Client};
1+
use mongodb::{Client, options::ClientOptions};
22
use std::env;
33

44
pub async fn connect() -> Result<Client, Box<dyn std::error::Error>> {

src/errors/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
pub mod routes;
22
pub mod services;
33

4-
pub use routes::map_actix_error;
54
pub use routes::ApiError;
5+
pub use routes::map_actix_error;
66
pub use services::ServiceError;

src/lib.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,9 @@ pub mod utils;
88
pub mod test_utils {
99
use crate::routes::config;
1010
use crate::utils::app::build_app_state;
11-
use actix_web::{web, App};
11+
use actix_web::{App, web};
1212
use dotenvy::dotenv;
13-
use mongodb::{options::ClientOptions, Client};
13+
use mongodb::{Client, options::ClientOptions};
1414
use redis::aio::MultiplexedConnection;
1515
use std::sync::Arc;
1616

src/main.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ pub mod utils;
88
use actix_middleware_etag::Etag;
99
use actix_web::dev::Service;
1010
use actix_web::middleware::{Compress, Logger};
11-
use actix_web::{dev::ServiceRequest, web, App, HttpServer};
11+
use actix_web::{App, HttpServer, dev::ServiceRequest, web};
1212
use actix_web_prom::PrometheusMetricsBuilder;
1313
use dotenvy::dotenv;
1414
use prometheus::{IntCounterVec, Opts};
@@ -104,7 +104,7 @@ async fn main() -> std::io::Result<()> {
104104

105105
srv.call(req)
106106
})
107-
.wrap(Etag)
107+
.wrap(Etag::default())
108108
.wrap(Compress::default())
109109
.wrap(prometheus.clone())
110110
.wrap(logger)

src/models/curseforge/entities.rs

Lines changed: 57 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,11 @@
11
use chrono::{DateTime, Utc};
2-
use serde::{Deserialize, Serialize};
3-
use utoipa::ToSchema;
2+
use serde::Deserialize;
3+
use serde_with::serde_as;
44

5-
use bson::serde_helpers::{
6-
chrono_datetime_as_bson_datetime, chrono_datetime_as_bson_datetime_optional,
7-
};
5+
use bson::serde_helpers::datetime::FromChrono04DateTime;
86

9-
#[derive(Debug, Serialize, Deserialize, Clone, ToSchema)]
7+
#[serde_as]
8+
#[derive(Debug, Deserialize, Clone)]
109
pub struct Category {
1110
#[serde(alias = "_id")]
1211
pub id: i32,
@@ -17,10 +16,8 @@ pub struct Category {
1716
pub url: Option<String>,
1817
#[serde(rename = "iconUrl")]
1918
pub icon_url: Option<String>,
20-
#[serde(
21-
rename = "dateModified",
22-
deserialize_with = "chrono_datetime_as_bson_datetime::deserialize"
23-
)]
19+
#[serde_as(as = "FromChrono04DateTime")]
20+
#[serde(rename = "dateModified")]
2421
pub date_modified: DateTime<Utc>,
2522
#[serde(rename = "isClass")]
2623
pub is_class: Option<bool>,
@@ -31,11 +28,12 @@ pub struct Category {
3128
#[serde(rename = "displayIndex")]
3229
pub display_index: i32,
3330

34-
#[serde(deserialize_with = "chrono_datetime_as_bson_datetime::deserialize")]
31+
#[serde_as(as = "FromChrono04DateTime")]
3532
pub sync_at: DateTime<Utc>,
3633
}
3734

38-
#[derive(Debug, Serialize, Deserialize, Clone, ToSchema)]
35+
#[serde_as]
36+
#[derive(Debug, Deserialize, Clone)]
3937
pub struct CategoryInfo {
4038
pub id: Option<i32>,
4139
#[serde(rename = "gameId")]
@@ -45,10 +43,8 @@ pub struct CategoryInfo {
4543
pub url: Option<String>,
4644
#[serde(rename = "iconUrl")]
4745
pub icon_url: Option<String>,
48-
#[serde(
49-
rename = "dateModified",
50-
deserialize_with = "chrono_datetime_as_bson_datetime_optional::deserialize"
51-
)]
46+
#[serde(rename = "dateModified")]
47+
#[serde_as(as = "Option<FromChrono04DateTime>")]
5248
pub date_modified: Option<DateTime<Utc>>,
5349
#[serde(rename = "isClass")]
5450
pub is_class: Option<bool>,
@@ -60,7 +56,8 @@ pub struct CategoryInfo {
6056
pub display_index: Option<i32>,
6157
}
6258

63-
#[derive(Debug, Serialize, Deserialize, Clone, ToSchema)]
59+
#[serde_as]
60+
#[derive(Debug, Deserialize, Clone)]
6461
pub struct File {
6562
#[serde(alias = "_id")]
6663
pub id: i32,
@@ -79,10 +76,8 @@ pub struct File {
7976
#[serde(rename = "fileStatus")]
8077
pub file_status: Option<i32>,
8178
pub hashes: Option<Vec<Hash>>,
82-
#[serde(
83-
rename = "fileDate",
84-
deserialize_with = "chrono_datetime_as_bson_datetime_optional::deserialize"
85-
)]
79+
#[serde(rename = "fileDate")]
80+
#[serde_as(as = "Option<FromChrono04DateTime>")]
8681
pub file_date: Option<DateTime<Utc>>,
8782
#[serde(rename = "fileLength")]
8883
pub file_length: Option<i64>,
@@ -109,20 +104,19 @@ pub struct File {
109104
pub server_pack_file_id: Option<i32>,
110105
#[serde(rename = "isEarlyAccessContent")]
111106
pub is_early_access_content: Option<bool>,
112-
#[serde(
113-
rename = "earlyAccessEndDate",
114-
deserialize_with = "chrono_datetime_as_bson_datetime_optional::deserialize"
115-
)]
107+
#[serde(rename = "earlyAccessEndDate")]
108+
#[serde_as(as = "Option<FromChrono04DateTime>")]
116109
pub early_access_end_date: Option<DateTime<Utc>>,
117110
#[serde(rename = "fileFingerprint")]
118111
pub file_fingerprint: Option<i64>,
119112
pub modules: Option<Vec<Module>>,
120113

121-
#[serde(deserialize_with = "chrono_datetime_as_bson_datetime::deserialize")]
114+
#[serde_as(as = "FromChrono04DateTime")]
122115
pub sync_at: DateTime<Utc>,
123116
}
124117

125-
#[derive(Debug, Serialize, Deserialize, Clone, ToSchema)]
118+
#[serde_as]
119+
#[derive(Debug, Deserialize, Clone)]
126120
pub struct FileInfo {
127121
pub id: i32,
128122
#[serde(rename = "gameId")]
@@ -140,10 +134,8 @@ pub struct FileInfo {
140134
#[serde(rename = "fileStatus")]
141135
pub file_status: Option<i32>,
142136
pub hashes: Option<Vec<Hash>>,
143-
#[serde(
144-
rename = "fileDate",
145-
deserialize_with = "chrono_datetime_as_bson_datetime_optional::deserialize"
146-
)]
137+
#[serde(rename = "fileDate")]
138+
#[serde_as(as = "Option<FromChrono04DateTime>")]
147139
pub file_date: Option<DateTime<Utc>>,
148140
#[serde(rename = "fileLength")]
149141
pub file_length: Option<i64>,
@@ -170,17 +162,16 @@ pub struct FileInfo {
170162
pub server_pack_file_id: Option<i32>,
171163
#[serde(rename = "isEarlyAccessContent")]
172164
pub is_early_access_content: Option<bool>,
173-
#[serde(
174-
rename = "earlyAccessEndDate",
175-
deserialize_with = "chrono_datetime_as_bson_datetime_optional::deserialize"
176-
)]
165+
#[serde(rename = "earlyAccessEndDate")]
166+
#[serde_as(as = "Option<FromChrono04DateTime>")]
177167
pub early_access_end_date: Option<DateTime<Utc>>,
178168
#[serde(rename = "fileFingerprint")]
179169
pub file_fingerprint: Option<i64>,
180170
pub modules: Option<Vec<Module>>,
181171
}
182172

183-
#[derive(Debug, Serialize, Deserialize, Clone, ToSchema)]
173+
#[serde_as]
174+
#[derive(Debug, Deserialize, Clone)]
184175
pub struct Mod {
185176
#[serde(alias = "_id")]
186177
pub id: i32,
@@ -209,20 +200,14 @@ pub struct Mod {
209200
pub latest_files: Option<Vec<FileInfo>>,
210201
#[serde(rename = "latestFilesIndexes")]
211202
pub latest_files_indexes: Option<Vec<FileIndex>>,
212-
#[serde(
213-
rename = "dateCreated",
214-
deserialize_with = "chrono_datetime_as_bson_datetime_optional::deserialize"
215-
)]
203+
#[serde(rename = "dateCreated")]
204+
#[serde_as(as = "Option<FromChrono04DateTime>")]
216205
pub date_created: Option<DateTime<Utc>>,
217-
#[serde(
218-
rename = "dateModified",
219-
deserialize_with = "chrono_datetime_as_bson_datetime_optional::deserialize"
220-
)]
206+
#[serde(rename = "dateModified")]
207+
#[serde_as(as = "Option<FromChrono04DateTime>")]
221208
pub date_modified: Option<DateTime<Utc>>,
222-
#[serde(
223-
rename = "dateReleased",
224-
deserialize_with = "chrono_datetime_as_bson_datetime_optional::deserialize"
225-
)]
209+
#[serde(rename = "dateReleased")]
210+
#[serde_as(as = "Option<FromChrono04DateTime>")]
226211
pub date_released: Option<DateTime<Utc>>,
227212
#[serde(rename = "allowModDistribution")]
228213
pub allow_mod_distribution: Option<bool>,
@@ -234,61 +219,65 @@ pub struct Mod {
234219
pub thumbs_up_count: Option<i32>,
235220
pub rating: Option<i32>,
236221

237-
#[serde(deserialize_with = "chrono_datetime_as_bson_datetime::deserialize")]
222+
#[serde_as(as = "FromChrono04DateTime")]
238223
pub sync_at: DateTime<Utc>,
239224
}
240225

241-
// #[derive(Debug, Serialize, Deserialize, Clone, ToSchema)]
226+
// #[serde_as]
227+
// #[derive(Debug, Deserialize, Clone)]
242228
// pub struct Fingerprint {
243229
// #[serde(alias = "_id")]
244230
// pub id: i64,
245231
// pub file: FileInfo,
246232
// #[serde(rename = "latestFiles")]
247233
// pub latest_files: Vec<FileInfo>,
248234

249-
// #[serde(deserialize_with = "chrono_datetime_as_bson_datetime::deserialize")]
235+
// #[serde_as(as = "FromChrono04DateTime")]
250236
// pub sync_at: DateTime<Utc>,
251237
// }
252238

253-
#[derive(Debug, Serialize, Deserialize, Clone, ToSchema)]
239+
#[serde_as]
240+
#[derive(Debug, Deserialize, Clone)]
254241
pub struct FileDependencies {
255242
#[serde(rename = "modId")]
256243
pub mod_id: i32,
257244
#[serde(rename = "relationType")]
258245
pub relation_type: Option<i32>,
259246
}
260247

261-
#[derive(Debug, Serialize, Deserialize, Clone, ToSchema)]
248+
#[serde_as]
249+
#[derive(Debug, Deserialize, Clone)]
262250
pub struct FileSortableGameVersions {
263251
#[serde(rename = "gameVersionName")]
264252
pub game_version_name: Option<String>,
265253
#[serde(rename = "gameVersionPadded")]
266254
pub game_version_padded: Option<String>,
267255
#[serde(rename = "gameVersion")]
268256
pub game_version: Option<String>,
269-
#[serde(
270-
rename = "gameVersionReleaseDate",
271-
deserialize_with = "chrono_datetime_as_bson_datetime_optional::deserialize"
272-
)]
257+
#[serde(rename = "gameVersionReleaseDate")]
258+
#[serde_as(as = "Option<FromChrono04DateTime>")]
273259
pub game_version_release_date: Option<DateTime<Utc>>,
274260
#[serde(rename = "gameVersionTypeId")]
275261
pub game_version_type_id: Option<i32>,
276262
}
277263

278-
#[derive(Debug, Serialize, Deserialize, Clone, ToSchema)]
264+
#[serde_as]
265+
#[derive(Debug, Deserialize, Clone)]
279266
pub struct Hash {
280267
pub value: String,
281268
pub algo: i32,
282269
}
283270

284-
#[derive(Debug, Serialize, Deserialize, Clone, ToSchema)]
271+
#[serde_as]
272+
#[derive(Debug, Deserialize, Clone)]
285273
pub struct Author {
286274
pub id: i32,
287275
pub name: String,
288276
pub url: Option<String>,
289277
}
290278

291-
#[derive(Debug, Serialize, Deserialize, Clone, ToSchema)]
279+
#[serde_as]
280+
#[derive(Debug, Deserialize, Clone)]
292281
pub struct Logo {
293282
pub id: i32,
294283
#[serde(rename = "modId")]
@@ -300,7 +289,8 @@ pub struct Logo {
300289
pub url: Option<String>,
301290
}
302291

303-
#[derive(Debug, Serialize, Deserialize, Clone, ToSchema)]
292+
#[serde_as]
293+
#[derive(Debug, Deserialize, Clone)]
304294
pub struct Links {
305295
#[serde(rename = "websiteUrl")]
306296
pub website_url: Option<String>,
@@ -312,7 +302,8 @@ pub struct Links {
312302
pub source_url: Option<String>,
313303
}
314304

315-
#[derive(Debug, Serialize, Deserialize, Clone, ToSchema)]
305+
#[serde_as]
306+
#[derive(Debug, Deserialize, Clone)]
316307
pub struct ScreenShot {
317308
pub id: i32,
318309
#[serde(rename = "modId")]
@@ -324,13 +315,15 @@ pub struct ScreenShot {
324315
pub url: Option<String>,
325316
}
326317

327-
#[derive(Debug, Serialize, Deserialize, Clone, ToSchema)]
318+
#[serde_as]
319+
#[derive(Debug, Deserialize, Clone)]
328320
pub struct Module {
329321
pub name: Option<String>,
330322
pub fingerprint: Option<i64>,
331323
}
332324

333-
#[derive(Debug, Serialize, Deserialize, Clone, ToSchema)]
325+
#[serde_as]
326+
#[derive(Debug, Deserialize, Clone)]
334327
pub struct FileIndex {
335328
#[serde(rename = "gameVersion")]
336329
pub game_version: Option<String>,

0 commit comments

Comments
 (0)