#[cfg(feature = "serde")]
use serde::{Deserialize, Serialize};
#[repr(u8)]
#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub enum Tier {
Reject = 0,
Bronze = 1,
Silver = 2,
Gold = 3,
Platinum = 4,
}
impl Tier {
#[inline]
pub fn from_delta(delta: f32) -> Self {
if delta >= 0.75 {
Self::Platinum
} else if delta >= 0.60 {
Self::Gold
} else if delta >= 0.40 {
Self::Silver
} else if delta >= 0.20 {
Self::Bronze
} else {
Self::Reject
}
}
pub const fn symbol(self) -> &'static str {
match self {
Self::Reject => "⊘",
Self::Bronze => "◊⁻",
Self::Silver => "◊",
Self::Gold => "◊⁺",
Self::Platinum => "◊⁺⁺",
}
}
pub const fn name(self) -> &'static str {
match self {
Self::Reject => "Reject",
Self::Bronze => "Bronze",
Self::Silver => "Silver",
Self::Gold => "Gold",
Self::Platinum => "Platinum",
}
}
pub const fn threshold(self) -> f32 {
match self {
Self::Reject => 0.0,
Self::Bronze => 0.20,
Self::Silver => 0.40,
Self::Gold => 0.60,
Self::Platinum => 0.75,
}
}
pub const fn is_production_ready(self) -> bool {
matches!(self, Self::Gold | Self::Platinum)
}
}
impl Default for Tier {
fn default() -> Self {
Self::Reject
}
}
impl core::fmt::Display for Tier {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
write!(f, "{} {}", self.symbol(), self.name())
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_tier_thresholds() {
assert_eq!(Tier::from_delta(0.75), Tier::Platinum);
assert_eq!(Tier::from_delta(0.74), Tier::Gold);
assert_eq!(Tier::from_delta(0.60), Tier::Gold);
assert_eq!(Tier::from_delta(0.59), Tier::Silver);
assert_eq!(Tier::from_delta(0.40), Tier::Silver);
assert_eq!(Tier::from_delta(0.39), Tier::Bronze);
assert_eq!(Tier::from_delta(0.20), Tier::Bronze);
assert_eq!(Tier::from_delta(0.19), Tier::Reject);
}
#[test]
fn test_tier_ordering() {
assert!(Tier::Platinum > Tier::Gold);
assert!(Tier::Gold > Tier::Silver);
assert!(Tier::Silver > Tier::Bronze);
assert!(Tier::Bronze > Tier::Reject);
}
}