use std::fmt::Display;
#[cfg(feature = "schema")]
use schemars::JsonSchema;
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, PartialEq, Eq)]
#[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(Debug, Clone, Copy, Deserialize, Serialize, PartialEq, Eq)]
#[cfg_attr(feature = "schema", derive(JsonSchema))]
#[serde(rename_all = "snake_case")]
pub enum AddonKind {
ResourcePack,
Mod,
Plugin,
Shader,
Datapack,
Modpack,
}
impl AddonKind {
pub fn parse_from_str(string: &str) -> Option<Self> {
match string {
"resource_pack" => Some(Self::ResourcePack),
"mod" => Some(Self::Mod),
"plugin" => Some(Self::Plugin),
"shader" => Some(Self::Shader),
"datapack" => Some(Self::Datapack),
"modpack" => Some(Self::Modpack),
_ => None,
}
}
pub fn to_plural_string(&self) -> String {
match self {
Self::ResourcePack => "resource_packs".into(),
Self::Mod => "mods".into(),
Self::Plugin => "plugins".into(),
Self::Shader => "shaders".into(),
Self::Datapack => "datapacks".into(),
Self::Modpack => "modpacks".into(),
}
}
pub fn get_extension(&self) -> &str {
match self {
AddonKind::Mod | AddonKind::Plugin => ".jar",
AddonKind::ResourcePack
| AddonKind::Shader
| AddonKind::Datapack
| AddonKind::Modpack => ".zip",
}
}
}
impl Display for AddonKind {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(
f,
"{}",
match self {
Self::ResourcePack => "resource_pack",
Self::Mod => "mod",
Self::Plugin => "plugin",
Self::Shader => "shader",
Self::Datapack => "datapack",
Self::Modpack => "modpack",
}
)
}
}
#[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, Default)]
#[serde(rename_all = "UPPERCASE")]
pub enum SkinVariant {
#[default]
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,
#[serde(default)]
pub url: Option<String>,
#[serde(default)]
pub path: Option<String>,
pub state: CosmeticState,
}
#[derive(Deserialize, Serialize, Debug, Copy, Clone, PartialEq, Eq)]
#[serde(rename_all = "UPPERCASE")]
pub enum CosmeticState {
Active,
Inactive,
}