use std::fmt::Display;
use std::str::FromStr;
use serde::{Deserialize, Serialize};
use uuid::Uuid;
#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Hash, Clone)]
#[serde(rename_all = "PascalCase")]
pub enum KillFinishingDamageType {
Melee,
Weapon,
Ability,
Bomb,
Fall,
}
impl Display for KillFinishingDamageType {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Self::Melee => write!(f, "Melee"),
Self::Weapon => write!(f, "Weapon"),
Self::Ability => write!(f, "Ability"),
Self::Bomb => write!(f, "Bomb"),
Self::Fall => write!(f, "Fall"),
}
}
}
impl FromStr for KillFinishingDamageType {
type Err = ();
fn from_str(s: &str) -> Result<Self, Self::Err> {
match s {
"Melee" => Ok(Self::Melee),
"Weapon" => Ok(Self::Weapon),
"Ability" => Ok(Self::Ability),
"Bomb" => Ok(Self::Bomb),
"Fall" => Ok(Self::Fall),
_ => Err(()),
}
}
}
#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Hash, Clone)]
#[serde(rename_all = "PascalCase")]
pub enum KillFinishingDamageItemAbility {
Ability1,
Ability2,
GrenadeAbility,
Ultimate,
}
impl Display for KillFinishingDamageItemAbility {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Self::Ability1 => write!(f, "Ability1"),
Self::Ability2 => write!(f, "Ability2"),
Self::GrenadeAbility => write!(f, "GrenadeAbility"),
Self::Ultimate => write!(f, "Ultimate"),
}
}
}
impl FromStr for KillFinishingDamageItemAbility {
type Err = ();
fn from_str(s: &str) -> Result<Self, Self::Err> {
match s {
"Ability1" => Ok(Self::Ability1),
"Ability2" => Ok(Self::Ability2),
"GrenadeAbility" => Ok(Self::GrenadeAbility),
"Ultimate" => Ok(Self::Ultimate),
_ => Err(()),
}
}
}
#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Hash, Clone)]
#[serde(untagged)]
pub enum KillFinishingDamageItem {
Weapon(Uuid),
Ability(KillFinishingDamageItemAbility),
Unknown(String),
}
impl Display for KillFinishingDamageItem {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Self::Weapon(uuid) => write!(f, "{uuid}"),
Self::Ability(ability) => write!(f, "{ability}"),
Self::Unknown(s) => write!(f, "{s}"),
}
}
}
impl FromStr for KillFinishingDamageItem {
type Err = ();
fn from_str(s: &str) -> Result<Self, Self::Err> {
if let Ok(uuid) = Uuid::parse_str(s) {
return Ok(Self::Weapon(uuid));
}
match s {
"Ability1" => Ok(Self::Ability(KillFinishingDamageItemAbility::Ability1)),
"Ability2" => Ok(Self::Ability(KillFinishingDamageItemAbility::Ability2)),
"GrenadeAbility" => Ok(Self::Ability(
KillFinishingDamageItemAbility::GrenadeAbility,
)),
"Ultimate" => Ok(Self::Ability(KillFinishingDamageItemAbility::Ultimate)),
_ => Ok(Self::Unknown(s.to_string())),
}
}
}