fujc/curse_api/modloader.rs
1use serde::Deserialize;
2use time::OffsetDateTime;
3
4use crate::{errors::CreatorError, minecraft::modloader::ModLoaderType};
5
6use super::{CurseApi, CURSE_API_URL};
7
8/// A Minecraft modloader version struct.
9///
10/// This struct is used to deserialize the response from the CurseForge API.
11///
12/// # Fields
13///
14/// * `name` - The name of the modloader version.
15/// * `game_version` - The game version of the modloader version.
16/// * `latest` - Whether or not the modloader version is the latest.
17/// * `recommended` - Whether or not the modloader version is the recommended.
18/// * `date_modified` - The date and time the modloader version was last modified.
19/// * `type_id` - The ID of the modloader version's type.
20#[derive(Debug, Deserialize)]
21#[serde(rename_all = "camelCase")]
22pub struct ModLoaderVersion {
23 /// The name of the modloader version.
24 pub name: String,
25 /// The game version of the modloader version.
26 pub game_version: String,
27 /// Whether or not the modloader version is the latest.
28 pub latest: bool,
29 /// Whether or not the modloader version is the recommended.
30 pub recommended: bool,
31 /// The date and time the modloader version was last modified.
32 #[serde(with = "time::serde::rfc3339")]
33 /// The ID of the modloader version's type.
34 pub date_modified: OffsetDateTime,
35 /// The ID of the modloader version's type.
36 #[serde(rename = "type")]
37 pub type_id: u32,
38}
39
40/// A list of Minecraft modloader versions.
41#[derive(Debug, Deserialize)]
42pub struct ModLoaderList {
43 /// The list of Minecraft modloader versions.
44 pub data: Vec<ModLoaderVersion>,
45}
46
47impl CurseApi {
48 /// Gets a list of Minecraft modloader versions.
49 ///
50 /// # Arguments
51 ///
52 /// * `game_version` - The game version to get modloader versions for.
53 /// * `modloader_type` - The type of modloader to get versions for.
54 ///
55 /// # Returns
56 ///
57 /// A list of Minecraft modloader versions.
58 pub async fn get_modloaders(
59 &self,
60 game_version: String,
61 modloader_type: &ModLoaderType,
62 ) -> Result<Vec<ModLoaderVersion>, CreatorError> {
63 let response = self
64 .http_client
65 .get(format!("{}{}", CURSE_API_URL, "minecraft/modloader").as_str())
66 .query(&[("version", game_version.as_str()), ("includeAll", "true")])
67 .send()
68 .await?;
69
70 if !response.status().is_success() {
71 return Err(CreatorError::NoModLoaderAvailable);
72 }
73
74 let versions: Vec<ModLoaderVersion> = response
75 .json::<ModLoaderList>()
76 .await?
77 .data
78 .into_iter()
79 .filter(|v| v.type_id == modloader_type.get_id())
80 .collect();
81
82 Ok(versions)
83 }
84}