minecraft_registry_api 1.4.2

Typed API clients for Minecraft modding platforms — Modrinth, Mojang, Paper, Purpur, Fabric, Forge, NeoForge
Documentation
use serde::Deserialize;

#[derive(Debug)]
pub struct DownloadSpec<'a> {
    pub hash: &'a str,
    pub file: &'a str,
}

#[derive(Debug, Deserialize)]
pub struct MojangRoot {
    pub latest: Latest,
    pub versions: Vec<Version>,
}

#[derive(Debug, Deserialize)]
pub struct Latest {
    pub release: String,
    pub snapshot: String,
}

#[derive(Debug, Deserialize)]
pub struct Version {
    pub id: String,

    #[serde(rename = "type")]
    pub type_field: String,

    pub url: String,
    pub time: String,

    #[serde(rename = "releaseTime")]
    pub release_time: String,

    pub sha1: String,

    #[serde(rename = "complianceLevel")]
    pub compliance_level: i64,
}

#[cfg(test)]
#[allow(clippy::unwrap_used)]
mod tests {
    use super::*;

    #[test]
    fn test_deserialize_manifest() {
        let json = serde_json::json!({
            "latest": { "release": "1.21.4", "snapshot": "1.21.4" },
            "versions": [
                {
                    "id": "1.21.4",
                    "type": "release",
                    "url": "https://example.com/1.21.4.json",
                    "time": "2024-12-03T13:00:00+00:00",
                    "releaseTime": "2024-12-03T13:00:00+00:00",
                    "sha1": "abc123",
                    "complianceLevel": 1
                }
            ]
        });
        let root: MojangRoot = serde_json::from_value(json).unwrap();
        assert_eq!(root.latest.release, "1.21.4");
        assert_eq!(root.versions.len(), 1);
        assert_eq!(root.versions[0].id, "1.21.4");
        assert_eq!(root.versions[0].type_field, "release");
        assert_eq!(root.versions[0].compliance_level, 1);
    }
}