use std::fmt::Display;
use std::fmt::Formatter;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum Auspice {
GreatAuspicious,
Auspicious,
Neutral,
Inauspicious,
GreatInauspicious,
}
impl Auspice {
pub const fn name(self) -> &'static str {
match self {
Self::GreatAuspicious => "大吉",
Self::Auspicious => "吉",
Self::Neutral => "中和",
Self::Inauspicious => "凶",
Self::GreatInauspicious => "大凶",
}
}
pub const fn is_auspicious(self) -> bool { matches!(self, Self::GreatAuspicious | Self::Auspicious) }
pub const fn is_inauspicious(self) -> bool { matches!(self, Self::GreatInauspicious | Self::Inauspicious) }
pub const fn is_extreme(self) -> bool { matches!(self, Self::GreatAuspicious | Self::GreatInauspicious) }
}
impl Display for Auspice {
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { f.write_str(self.name()) }
}
pub trait Auspicious {
fn name(&self) -> &'static str;
fn summary(&self) -> &'static str;
fn auspice(&self) -> Auspice;
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn auspicious_classification() {
assert!(Auspice::GreatAuspicious.is_auspicious());
assert!(Auspice::Auspicious.is_auspicious());
assert!(!Auspice::Neutral.is_auspicious());
assert!(!Auspice::Inauspicious.is_auspicious());
assert!(Auspice::GreatInauspicious.is_inauspicious());
assert!(Auspice::Inauspicious.is_inauspicious());
assert!(!Auspice::Neutral.is_inauspicious());
assert!(Auspice::GreatAuspicious.is_extreme());
assert!(Auspice::GreatInauspicious.is_extreme());
assert!(!Auspice::Auspicious.is_extreme());
}
#[test]
fn names() {
assert_eq!(Auspice::GreatAuspicious.name(), "大吉");
assert_eq!(Auspice::Inauspicious.name(), "凶");
}
}