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}