async_graphql/validators/
multiple_of.rs

1use std::{fmt::Display, ops::Rem};
2
3use num_traits::{AsPrimitive, Zero};
4
5use crate::{InputType, InputValueError};
6
7pub fn multiple_of<T, N>(value: &T, n: N) -> Result<(), InputValueError<T>>
8where
9    T: AsPrimitive<N> + InputType,
10    N: Rem<Output = N> + Zero + Display + Copy + PartialEq + 'static,
11{
12    let value = value.as_();
13    if !value.is_zero() && value % n == N::zero() {
14        Ok(())
15    } else {
16        Err(format!("the value must be a multiple of {}.", n).into())
17    }
18}
19
20#[cfg(test)]
21mod tests {
22    use super::*;
23
24    #[test]
25    fn test_multiple_of() {
26        assert!(multiple_of(&5, 3).is_err());
27        assert!(multiple_of(&6, 3).is_ok());
28        assert!(multiple_of(&0, 3).is_err());
29    }
30}