mod as_integer;
#[cfg(feature = "rusqlite")]
pub mod rusqlite;
pub mod direct_match;
pub use as_integer::AsInteger;
#[cfg(feature = "serde")]
use serde::{Deserialize, Serialize};
#[derive(Clone, Debug)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[cfg_attr(feature = "serde", serde(rename_all = "snake_case"))]
pub enum NumberCriterium<N> {
Equals(N),
LessThan(N),
LessThanOrEqual(N),
GreaterThan(N),
GreaterThanOrEqual(N),
InList(Vec<N>),
IsNone,
}
impl<N> From<N> for NumberCriterium<N> {
fn from(from: N) -> Self {
NumberCriterium::Equals(from)
}
}
impl<N> From<Option<N>> for NumberCriterium<N> {
fn from(from: Option<N>) -> Self {
if let Some(from) = from {
NumberCriterium::Equals(from)
} else {
NumberCriterium::IsNone
}
}
}
impl<N> From<Vec<N>> for NumberCriterium<N> {
fn from(from: Vec<N>) -> Self {
NumberCriterium::InList(from)
}
}
impl<N> NumberCriterium<N>
where
N: Copy,
{
pub fn translate<F, O>(&self, func: F) -> NumberCriterium<O>
where
F: Fn(N) -> O,
{
match self {
Self::Equals(n) => NumberCriterium::Equals(func(*n)),
Self::LessThan(n) => NumberCriterium::LessThan(func(*n)),
Self::LessThanOrEqual(n) => NumberCriterium::LessThanOrEqual(func(*n)),
Self::GreaterThan(n) => NumberCriterium::GreaterThan(func(*n)),
Self::GreaterThanOrEqual(n) => NumberCriterium::GreaterThanOrEqual(func(*n)),
Self::InList(l) => NumberCriterium::InList(l.iter().map(|n| func(*n)).collect()),
Self::IsNone => NumberCriterium::IsNone,
}
}
}
#[cfg(test)]
mod test {
use super::*;
use crate::direct_match::DirectMatch;
#[test]
fn direct_match_integer_equal() {
assert!(NumberCriterium::Equals(238 as u8).criterium_match(&(238 as i64)));
assert!(NumberCriterium::Equals(-23 as i8).criterium_match(&(-23 as i64)));
assert!(!NumberCriterium::Equals(-238 as i16).criterium_match(&(238 as u16)));
assert!(!NumberCriterium::Equals(1 as u8).criterium_match(&(0 as i64)));
}
#[test]
fn direct_match_float_equal() {
assert!(NumberCriterium::Equals(1.56f32).criterium_match(&1.56f32));
assert!(NumberCriterium::Equals(1.56f64).criterium_match(&1.56f64));
}
#[test]
fn direct_match_i128_equal() {
assert!(NumberCriterium::Equals(-67e267 as i128).criterium_match(&(-67e267 as i128)));
}
#[test]
fn direct_match_integer_compare() {
assert!(NumberCriterium::LessThan(156i32).criterium_match(&-156));
assert!(!NumberCriterium::LessThan(156i32).criterium_match(&156));
assert!(!NumberCriterium::LessThan(-156i32).criterium_match(&156));
assert!(NumberCriterium::LessThanOrEqual(156i16).criterium_match(&-156));
assert!(NumberCriterium::LessThanOrEqual(156i16).criterium_match(&156));
assert!(!NumberCriterium::LessThanOrEqual(-156i16).criterium_match(&156));
assert!(!NumberCriterium::GreaterThan(156i64).criterium_match(&-156));
assert!(!NumberCriterium::GreaterThan(156i64).criterium_match(&156));
assert!(NumberCriterium::GreaterThan(-156i64).criterium_match(&156));
assert!(!NumberCriterium::GreaterThanOrEqual(156i64).criterium_match(&-156));
assert!(NumberCriterium::GreaterThanOrEqual(156i64).criterium_match(&156));
assert!(NumberCriterium::GreaterThanOrEqual(-156i64).criterium_match(&156));
}
#[test]
fn direct_match_number_opt() {
assert!(NumberCriterium::<i32>::IsNone.criterium_match(&None));
assert!(!NumberCriterium::<u8>::IsNone.criterium_match(&3132));
assert!(!NumberCriterium::IsNone.criterium_match(&Some(-31e31 as i64)));
assert!(!NumberCriterium::GreaterThanOrEqual(156i64).criterium_match(&None));
assert!(!NumberCriterium::GreaterThan(-156.0f64).criterium_match(&None));
assert!(!NumberCriterium::LessThanOrEqual(15638217i32).criterium_match(&None));
assert!(!NumberCriterium::LessThan(-156i16).criterium_match(&None));
assert!(!NumberCriterium::Equals(0u8).criterium_match(&None));
}
#[test]
fn direct_match_range() {
assert_eq!(
NumberCriterium::Equals(2).criterium_match(&(3..=5)),
Some(false)
);
assert_eq!(NumberCriterium::Equals(3).criterium_match(&(3..=5)), None);
assert_eq!(NumberCriterium::Equals(4).criterium_match(&(3..=5)), None);
assert_eq!(NumberCriterium::Equals(5).criterium_match(&(3..=5)), None);
assert_eq!(
NumberCriterium::Equals(6).criterium_match(&(3..=5)),
Some(false)
);
assert_eq!(
NumberCriterium::Equals(4).criterium_match(&(4..=4)),
Some(true)
);
assert_eq!(
NumberCriterium::Equals(4).criterium_match(&(5..=4)),
Some(false)
);
assert_eq!(
NumberCriterium::LessThan(2).criterium_match(&(3..=5)),
Some(false)
);
assert_eq!(
NumberCriterium::LessThan(3).criterium_match(&(3..=5)),
Some(false)
);
assert_eq!(NumberCriterium::LessThan(4).criterium_match(&(3..=5)), None);
assert_eq!(NumberCriterium::LessThan(5).criterium_match(&(3..=5)), None);
assert_eq!(
NumberCriterium::LessThan(6).criterium_match(&(3..=5)),
Some(true)
);
assert_eq!(
NumberCriterium::LessThanOrEqual(2).criterium_match(&(3..=5)),
Some(false)
);
assert_eq!(
NumberCriterium::LessThanOrEqual(3).criterium_match(&(3..=5)),
None
);
assert_eq!(
NumberCriterium::LessThanOrEqual(4).criterium_match(&(3..=5)),
None
);
assert_eq!(
NumberCriterium::LessThanOrEqual(5).criterium_match(&(3..=5)),
None
);
assert_eq!(
NumberCriterium::LessThanOrEqual(6).criterium_match(&(3..=5)),
Some(true)
);
assert_eq!(
NumberCriterium::GreaterThan(2).criterium_match(&(3..=5)),
Some(true)
);
assert_eq!(
NumberCriterium::GreaterThan(3).criterium_match(&(3..=5)),
None
);
assert_eq!(
NumberCriterium::GreaterThan(4).criterium_match(&(3..=5)),
None
);
assert_eq!(
NumberCriterium::GreaterThan(5).criterium_match(&(3..=5)),
Some(false)
);
assert_eq!(
NumberCriterium::GreaterThan(6).criterium_match(&(3..=5)),
Some(false)
);
assert_eq!(
NumberCriterium::GreaterThanOrEqual(2).criterium_match(&(3..=5)),
Some(true)
);
assert_eq!(
NumberCriterium::GreaterThanOrEqual(3).criterium_match(&(3..=5)),
None
);
assert_eq!(
NumberCriterium::GreaterThanOrEqual(4).criterium_match(&(3..=5)),
None
);
assert_eq!(
NumberCriterium::GreaterThanOrEqual(5).criterium_match(&(3..=5)),
None
);
assert_eq!(
NumberCriterium::GreaterThanOrEqual(6).criterium_match(&(3..=5)),
Some(false)
);
assert_eq!(
NumberCriterium::InList(vec![]).criterium_match(&(3..=5)),
Some(false)
);
assert_eq!(
NumberCriterium::InList(vec![2, 6]).criterium_match(&(3..=5)),
Some(false)
);
assert_eq!(
NumberCriterium::InList(vec![4]).criterium_match(&(3..=5)),
None
);
assert_eq!(
NumberCriterium::InList(vec![4, 5]).criterium_match(&(3..=5)),
None
);
assert_eq!(
NumberCriterium::InList(vec![4, 5, 6]).criterium_match(&(3..=5)),
None
);
assert_eq!(
NumberCriterium::InList(vec![4, 5, 6, 7]).criterium_match(&(3..=5)),
None
);
assert_eq!(
NumberCriterium::InList(vec![3, 4, 4]).criterium_match(&(3..=5)),
None
);
assert_eq!(
NumberCriterium::InList(vec![3, 4, 5]).criterium_match(&(3..=5)),
Some(true)
);
assert_eq!(
NumberCriterium::InList(vec![5, 4, 3]).criterium_match(&(3..=5)),
Some(true)
);
assert_eq!(
NumberCriterium::InList(vec![5, 3, 7, 4, 5, 8, 10, 0]).criterium_match(&(3..=5)),
Some(true)
);
}
}