use std::fmt::Display;
use schemars::JsonSchema;
use serde::Deserialize;
use crate::pkg::{PackageAddonOptionalHashes, PackageID};
#[derive(Debug, Clone)]
pub struct Addon {
pub kind: AddonKind,
pub id: String,
pub file_name: String,
pub pkg_id: PackageID,
pub version: Option<String>,
pub hashes: PackageAddonOptionalHashes,
}
#[derive(Debug, Clone, Copy, Deserialize, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum AddonKind {
ResourcePack,
Mod,
Plugin,
Shader,
Datapack,
}
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),
_ => 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(),
}
}
pub fn get_extension(&self) -> &str {
match self {
AddonKind::Mod | AddonKind::Plugin => ".jar",
AddonKind::ResourcePack | AddonKind::Shader | AddonKind::Datapack => ".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",
}
)
}
}
pub fn is_addon_version_valid(version: &str) -> bool {
if !version.is_ascii() {
return false;
}
for c in version.chars() {
if !c.is_ascii_alphanumeric() && c != '-' {
return false;
}
}
true
}
pub fn is_filename_valid(kind: AddonKind, filename: &str) -> bool {
filename.ends_with(kind.get_extension())
}