async-graphql/src/validators/multiple_of.rs
2022-04-19 19:18:06 +08:00

31 lines
722 B
Rust

use std::{fmt::Display, ops::Rem};
use num_traits::{AsPrimitive, Zero};
use crate::{InputType, InputValueError};
pub fn multiple_of<T, N>(value: &T, n: N) -> Result<(), InputValueError<T>>
where
T: AsPrimitive<N> + InputType,
N: Rem<Output = N> + Zero + Display + Copy + PartialEq + 'static,
{
let value = value.as_();
if !value.is_zero() && value % n == N::zero() {
Ok(())
} else {
Err(format!("the value must be a multiple of {}.", n).into())
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_multiple_of() {
assert!(multiple_of(&5, 3).is_err());
assert!(multiple_of(&6, 3).is_ok());
assert!(multiple_of(&0, 3).is_err());
}
}