use std::fmt::Display;
use serde::{Deserialize, Serialize};
use super::json;
#[derive(Deserialize, Serialize, Debug, Clone, PartialEq)]
pub enum MinecraftLatestVersion {
#[serde(rename = "latest")]
Release,
#[serde(rename = "latest_snapshot")]
Snapshot,
}
#[derive(Deserialize, Serialize, Debug, Clone, PartialEq)]
#[serde(rename_all = "snake_case")]
#[serde(untagged)]
pub enum MinecraftVersionDeser {
Latest(MinecraftLatestVersion),
Version(String),
}
impl MinecraftVersionDeser {
pub fn to_mc_version(&self) -> MinecraftVersion {
match self {
Self::Version(version) => MinecraftVersion::Version(version.clone()),
Self::Latest(MinecraftLatestVersion::Release) => MinecraftVersion::Latest,
Self::Latest(MinecraftLatestVersion::Snapshot) => MinecraftVersion::LatestSnapshot,
}
}
}
#[derive(Debug, Clone)]
pub enum MinecraftVersion {
Version(String),
Latest,
LatestSnapshot,
}
impl MinecraftVersion {
pub fn get_version(&self, manifest: &json::JsonObject) -> anyhow::Result<String> {
match self {
Self::Version(version) => Ok(version.clone()),
Self::Latest => {
let latest = json::access_object(manifest, "latest")?;
Ok(String::from(json::access_str(latest, "release")?))
}
Self::LatestSnapshot => {
let latest = json::access_object(manifest, "latest")?;
Ok(String::from(json::access_str(latest, "snapshot")?))
}
}
}
}
impl Display for MinecraftVersion {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(
f,
"{}",
match self {
Self::Version(version) => version,
Self::Latest => "Latest",
Self::LatestSnapshot => "Latest Snaphot",
}
)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_minecraft_version_deserialization() {
#[derive(Deserialize)]
struct Test {
version: MinecraftVersionDeser,
}
assert_eq!(
serde_json::from_str::<Test>(r#"{"version": "1.19"}"#)
.unwrap()
.version,
MinecraftVersionDeser::Version(String::from("1.19"))
);
assert_eq!(
serde_json::from_str::<Test>(r#"{"version": "latest"}"#)
.unwrap()
.version,
MinecraftVersionDeser::Latest(MinecraftLatestVersion::Release)
);
assert_eq!(
serde_json::from_str::<Test>(r#"{"version": "latest_snapshot"}"#)
.unwrap()
.version,
MinecraftVersionDeser::Latest(MinecraftLatestVersion::Snapshot)
);
}
}