cobble_core/minecraft/models/
version_manifest.rs

1use crate::consts;
2use crate::minecraft::models::VersionSummary;
3use serde::{Deserialize, Serialize};
4use std::collections::HashMap;
5
6/// Manifest with all Minecraft versions.
7/// Includes identifiers for the latest release and snapshot version.
8#[derive(Clone, Debug, Deserialize, Serialize)]
9pub struct VersionManifest {
10    /// Latest release and snapshot version
11    pub latest: LatestVersion,
12    /// Map of all versions
13    pub versions: HashMap<String, VersionSummary>,
14}
15
16impl VersionManifest {
17    /// Gets the manifest from Minecraft servers.
18    pub async fn fetch() -> reqwest::Result<Self> {
19        reqwest::get(consts::MC_VERSION_MANIFEST_URL)
20            .await?
21            .error_for_status()?
22            .json::<VersionManifestResponse>()
23            .await
24            .map(Self::from)
25    }
26}
27
28/// Holds latest release and snapshot version IDs.
29#[derive(Clone, Debug, Deserialize, Serialize)]
30pub struct LatestVersion {
31    /// Latest stable release
32    pub release: String,
33    /// Latest snapshot
34    pub snapshot: String,
35}
36
37#[derive(Clone, Debug, Deserialize, Serialize)]
38struct VersionManifestResponse {
39    pub latest: LatestVersion,
40    pub versions: Vec<VersionSummary>,
41}
42
43impl From<VersionManifestResponse> for VersionManifest {
44    fn from(manifest: VersionManifestResponse) -> Self {
45        let mut versions = HashMap::new();
46
47        for version in manifest.versions {
48            versions.insert(version.id.clone(), version);
49        }
50
51        Self {
52            latest: manifest.latest,
53            versions,
54        }
55    }
56}