use crate::Dim;
#[derive(Copy, Clone, Eq, PartialEq, Debug)]
pub enum Verdict {
Continue,
Warn(Dim),
Exhausted(Dim),
}
impl Verdict {
#[must_use]
pub const fn worst(self, other: Self) -> Self {
match (self, other) {
(Self::Exhausted(dim), _) | (_, Self::Exhausted(dim)) => Self::Exhausted(dim),
(Self::Warn(dim), _) | (_, Self::Warn(dim)) => Self::Warn(dim),
(Self::Continue, Self::Continue) => Self::Continue,
}
}
#[must_use]
pub const fn is_continuing(self) -> bool {
!matches!(self, Self::Exhausted(_))
}
#[must_use]
pub const fn is_exhausted(self) -> bool {
matches!(self, Self::Exhausted(_))
}
#[must_use]
pub const fn dimension(self) -> Option<Dim> {
match self {
Self::Continue => None,
Self::Warn(d) | Self::Exhausted(d) => Some(d),
}
}
}
#[cfg(test)]
#[allow(clippy::indexing_slicing)]
mod tests {
use super::*;
#[test]
fn continue_is_continuing_and_not_exhausted() {
let v = Verdict::Continue;
assert!(v.is_continuing());
assert!(!v.is_exhausted());
assert_eq!(v.dimension(), None);
}
#[test]
fn warn_is_continuing_and_not_exhausted() {
let v = Verdict::Warn(Dim::Tokens);
assert!(v.is_continuing());
assert!(!v.is_exhausted());
assert_eq!(v.dimension(), Some(Dim::Tokens));
}
#[test]
fn exhausted_is_not_continuing() {
let v = Verdict::Exhausted(Dim::Millis);
assert!(!v.is_continuing());
assert!(v.is_exhausted());
assert_eq!(v.dimension(), Some(Dim::Millis));
}
#[test]
fn worst_prefers_exhausted_over_warn_and_continue() {
assert_eq!(
Verdict::Continue.worst(Verdict::Exhausted(Dim::Tokens)),
Verdict::Exhausted(Dim::Tokens)
);
assert_eq!(
Verdict::Warn(Dim::Millis).worst(Verdict::Exhausted(Dim::Bytes)),
Verdict::Exhausted(Dim::Bytes)
);
}
#[test]
fn worst_prefers_warn_over_continue() {
assert_eq!(
Verdict::Continue.worst(Verdict::Warn(Dim::Tokens)),
Verdict::Warn(Dim::Tokens)
);
assert_eq!(
Verdict::Warn(Dim::Millis).worst(Verdict::Continue),
Verdict::Warn(Dim::Millis)
);
}
#[test]
fn worst_is_left_biased_for_same_severity() {
assert_eq!(
Verdict::Warn(Dim::Tokens).worst(Verdict::Warn(Dim::Millis)),
Verdict::Warn(Dim::Tokens)
);
assert_eq!(
Verdict::Exhausted(Dim::Calls).worst(Verdict::Exhausted(Dim::Bytes)),
Verdict::Exhausted(Dim::Calls)
);
}
}