use core::fmt::{Debug, Display, Formatter, Result};

#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))]
#[cfg_attr(feature = "schemars", derive(::schemars::JsonSchema))]
pub enum Comparison {
    Less,
    LessOrEqual,
    Equal,
    Unequal,
    GreaterOrEqual,
    Greater,
}

impl Display for Comparison {
    fn fmt(&self, f: &mut Formatter<'_>) -> Result {
        f.write_str(match self {
            Comparison::Less => "less than",
            Comparison::LessOrEqual => "less than or equal to",
            Comparison::Equal => "equal to",
            Comparison::Unequal => "unequal to",
            Comparison::GreaterOrEqual => "greater than or equal to",
            Comparison::Greater => "greater than",
        })
    }
}

impl Comparison {
    pub fn compare<T: PartialOrd + PartialEq>(&self, a: &T, b: &T) -> bool {
        match self {
            Comparison::Less => a < b,
            Comparison::LessOrEqual => a <= b,
            Comparison::Equal => a == b,
            Comparison::Unequal => a != b,
            Comparison::GreaterOrEqual => a >= b,
            Comparison::Greater => a > b,
        }
    }
}
