use serde::{Deserialize, Serialize};
use crate::util::DefaultExt;
use crate::versions::VersionName;
#[derive(Deserialize, Serialize, Debug, Clone)]
pub struct VersionManifest {
#[serde(default)]
pub latest: Option<LatestVersions>,
pub versions: Vec<VersionEntry>,
}
#[derive(Deserialize, Serialize, Debug, Clone)]
pub struct VersionEntry {
pub id: String,
#[serde(rename = "type")]
#[serde(default)]
pub ty: VersionType,
pub url: String,
#[serde(default)]
#[serde(skip_serializing_if = "DefaultExt::is_default")]
pub is_zipped: bool,
#[serde(default)]
#[serde(skip_serializing_if = "DefaultExt::is_default")]
pub source: Option<String>,
}
#[derive(Deserialize, Serialize, Debug, Clone, Default)]
#[serde(rename_all = "snake_case")]
pub enum VersionType {
#[default]
Release,
Snapshot,
OldAlpha,
OldBeta,
#[serde(untagged)]
Other(String),
}
#[derive(Deserialize, Serialize, Debug, Clone)]
pub struct LatestVersions {
pub release: VersionName,
pub snapshot: VersionName,
}
#[derive(Deserialize, Serialize, Debug)]
pub struct MinecraftUserProfile {
pub name: String,
#[serde(rename = "id")]
pub uuid: String,
pub skins: Vec<Skin>,
pub capes: Vec<Cape>,
}
#[derive(Deserialize, Serialize, Debug)]
pub struct Skin {
#[serde(flatten)]
pub cosmetic: Cosmetic,
pub variant: SkinVariant,
}
#[derive(Deserialize, Serialize, Debug, Copy, Clone, PartialEq, Eq)]
#[serde(rename_all = "UPPERCASE")]
pub enum SkinVariant {
Classic,
Slim,
}
#[derive(Deserialize, Serialize, Debug)]
pub struct Cape {
#[serde(flatten)]
pub cosmetic: Cosmetic,
pub alias: String,
}
#[derive(Deserialize, Serialize, Debug)]
pub struct Cosmetic {
pub id: String,
pub url: String,
pub state: CosmeticState,
}
#[derive(Deserialize, Serialize, Debug, Copy, Clone, PartialEq, Eq)]
#[serde(rename_all = "UPPERCASE")]
pub enum CosmeticState {
Active,
Inactive,
}