cobble_core/minecraft/models/
version_manifest.rs1use crate::consts;
2use crate::minecraft::models::VersionSummary;
3use serde::{Deserialize, Serialize};
4use std::collections::HashMap;
5
6#[derive(Clone, Debug, Deserialize, Serialize)]
9pub struct VersionManifest {
10 pub latest: LatestVersion,
12 pub versions: HashMap<String, VersionSummary>,
14}
15
16impl VersionManifest {
17 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#[derive(Clone, Debug, Deserialize, Serialize)]
30pub struct LatestVersion {
31 pub release: String,
33 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}