#![forbid(unsafe_code)]
use std::num::NonZeroUsize;
#[must_use = "validation cadence values only affect diagnostics when they are used"]
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum ValidationCadence {
Never,
EveryN(NonZeroUsize),
}
impl ValidationCadence {
pub const fn from_optional_every(validate_every: Option<usize>) -> Self {
match validate_every {
None | Some(0) => Self::Never,
Some(every) => {
if let Some(every) = NonZeroUsize::new(every) {
Self::EveryN(every)
} else {
Self::Never
}
}
}
}
#[must_use]
pub const fn should_validate(self, insertion_count: usize) -> bool {
match self {
Self::Never => false,
Self::EveryN(every) => {
insertion_count != 0 && insertion_count.is_multiple_of(every.get())
}
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn validation_cadence_maps_optional_every() {
assert_eq!(
ValidationCadence::from_optional_every(None),
ValidationCadence::Never
);
assert_eq!(
ValidationCadence::from_optional_every(Some(0)),
ValidationCadence::Never
);
assert_eq!(
ValidationCadence::from_optional_every(Some(128)),
ValidationCadence::EveryN(NonZeroUsize::new(128).unwrap())
);
}
#[test]
fn validation_cadence_should_validate_on_multiples() {
let cadence = ValidationCadence::EveryN(NonZeroUsize::new(64).unwrap());
assert!(!cadence.should_validate(0));
assert!(!cadence.should_validate(63));
assert!(cadence.should_validate(64));
assert!(!cadence.should_validate(65));
assert!(cadence.should_validate(128));
assert!(!ValidationCadence::Never.should_validate(64));
}
}