range_checker 0.1.2

derive-macro crate aimed to provide declarative bounds checking and filtering for structure.
Documentation
fn main() {
    let mut a = TestStruct {
        v0: 20,
        v1: -3.0,
        v3: 1,
        ..Default::default()
    };

    // dbg!(range_checker::Check::check(&a));
    // dbg!(range_checker::CheckVerbose::check(&a));

    let _ = dbg!(a.check_with_fallback());

    dbg!(&a);

    let _ = dbg!(a.check());
}

use range_checker::Check;
use range_checker::CheckVerbose;

#[derive(Debug, Default, Check)]
struct TestStruct {
    #[range(..=5)]
    #[range(20..)]
    #[filter(|x| x % 2 != 0)]
    #[fallback(255)]
    pub v0: u8,
    #[range(-1.0..=5.0)]
    #[fallback(3.1)]
    v1: f32,
    #[filter(|x| x > 8.0)]
    #[fallback(9.9)]
    v2: f64,
    #[range(..-1)]
    #[fallback(|x| {println!("test fallback closure."); x - 5})]
    v3: isize,
}

#[cfg(test)]
pub mod test {
    use super::*;

    #[derive(Debug, Default, Check)]
    struct TestCheckStruct {
        #[range(..=5)]
        #[range(20..)]
        #[filter(|x| x % 2 != 0)]
        #[fallback(255)]
        pub v0: u8,
        #[range(-1.0..=5.0)]
        #[fallback(3.1)]
        v1: f32,
        #[filter(|x| x > 8.0)]
        #[fallback(9.9)]
        v2: f64,
        #[range(..-1)]
        #[fallback(|x| x - 5)]
        v3: isize,
    }

    #[test]
    fn basic_check_Check() {
        let mut a = TestCheckStruct {
            v0: 20,
            v1: -3.0,
            v3: 1,
            ..Default::default()
        };
    
        let _ = dbg!(a.check_with_fallback());
    
        dbg!(&a);
    
        let _ = dbg!(a.check());
    }

    #[derive(Debug, Default, CheckVerbose)]
    struct TestCheckVerboseStruct {
        #[range(..=5)]
        #[range(20..)]
        #[filter(|x| x % 2 != 0)]
        #[fallback(255)]
        pub v0: u8,
        #[range(-1.0..=5.0)]
        #[fallback(3.1)]
        v1: f32,
        #[filter(|x| x > 8.0)]
        #[fallback(9.9)]
        v2: f64,
        #[range(..-1)]
        #[fallback(|x| x - 5)]
        v3: isize,
    }

    #[test]
    fn basic_check_CheckVerbose() {
        let mut a = TestCheckVerboseStruct {
            v0: 20,
            v1: -3.0,
            v3: 1,
            ..Default::default()
        };
    
        let _ = dbg!(a.check_with_fallback());
    
        dbg!(&a);
    
        let _ = dbg!(a.check());
    }
}