range_checker 0.1.2

derive-macro crate aimed to provide declarative bounds checking and filtering for structure.
Documentation

# Expand Example

## Check

```rust
impl range_checker::Check for TestStruct {
    fn check(&self) -> Result<(), ()> {
        if !((..=5).contains(&self.v0) || (..=5).contains(&self.v0)
            || (20..).contains(&self.v0) && (|x| x % 2 != 0)(self.v0))
        {
            return Err(());
        }
        if !((-1.0..=5.0).contains(&self.v1) || (-1.0..=5.0).contains(&self.v1)) {
            return Err(());
        }
        if !((|x| x > 8.0)(self.v2) && (|x| x > 8.0)(self.v2)) {
            return Err(());
        }
        if !((..-1).contains(&self.v3) || (..-1).contains(&self.v3)) {
            return Err(());
        }
        Ok(())
    }
    #[allow(unreachable_code)]
    fn check_with_fallback(&mut self) -> Result<(), ()> {
        if !((..=5).contains(&self.v0) || (..=5).contains(&self.v0)
            || (20..).contains(&self.v0) && (|x| x % 2 != 0)(self.v0))
        {
            self.v0 = 255;
        }
        if !((-1.0..=5.0).contains(&self.v1) || (-1.0..=5.0).contains(&self.v1)) {
            self.v1 = 3.1;
        }
        if !((|x| x > 8.0)(self.v2) && (|x| x > 8.0)(self.v2)) {
            self.v2 = 9.9;
        }
        if !((..-1).contains(&self.v3) || (..-1).contains(&self.v3)) {
            self
                .v3 = (|x| {
                {
                    ::std::io::_print(
                        ::core::fmt::Arguments::new_v1(
                            &["test fallback closure.\n"],
                            &[],
                        ),
                    );
                };
                x - 5
            })(self.v3);
        }
        Ok(())
    }
}
```

## CheckVerbose

```rust
impl range_checker::CheckVerbose for TestStruct {
    fn check(&self) -> Result<(), Vec<range_checker::Error>> {
        let mut err_vec = ::alloc::vec::Vec::new();
        if !((..=5).contains(&self.v0) || (..=5).contains(&self.v0)
            || (20..).contains(&self.v0) && (|x| x % 2 != 0)(self.v0))
        {
            err_vec
                .push(range_checker::Error::CheckFailed {
                    ident: "v0".to_owned(),
                    value: (self.v0).to_string(),
                    check_statement: "(..= 5).contains(& self.v0) || (..= 5).contains(& self.v0) ||\n(20 ..).contains(& self.v0) && (| x | x % 2 != 0) (self.v0)"
                        .to_owned(),
                })
        }
        if !((-1.0..=5.0).contains(&self.v1) || (-1.0..=5.0).contains(&self.v1)) {
            err_vec
                .push(range_checker::Error::CheckFailed {
                    ident: "v1".to_owned(),
                    value: (self.v1).to_string(),
                    check_statement: "(- 1.0 ..= 5.0).contains(& self.v1) || (- 1.0 ..= 5.0).contains(& self.v1)"
                        .to_owned(),
                })
        }
        if !((|x| x > 8.0)(self.v2) && (|x| x > 8.0)(self.v2)) {
            err_vec
                .push(range_checker::Error::CheckFailed {
                    ident: "v2".to_owned(),
                    value: (self.v2).to_string(),
                    check_statement: "(| x | x > 8.0) (self.v2) && (| x | x > 8.0) (self.v2)"
                        .to_owned(),
                })
        }
        if !((..-1).contains(&self.v3) || (..-1).contains(&self.v3)) {
            err_vec
                .push(range_checker::Error::CheckFailed {
                    ident: "v3".to_owned(),
                    value: (self.v3).to_string(),
                    check_statement: "(.. - 1).contains(& self.v3) || (.. - 1).contains(& self.v3)"
                        .to_owned(),
                })
        }
        if err_vec.is_empty() { Ok(()) } else { Err(err_vec) }
    }
    fn check_with_fallback(
        &mut self,
    ) -> Result<Vec<range_checker::Error>, Vec<range_checker::Error>> {
        let mut ret_vec = ::alloc::vec::Vec::new();
        let mut failed = false;
        if !((..=5).contains(&self.v0) || (..=5).contains(&self.v0)
            || (20..).contains(&self.v0) && (|x| x % 2 != 0)(self.v0))
        {
            let fallback = 255;
            ret_vec
                .push(range_checker::Error::Fallback {
                    ident: "v0".to_owned(),
                    value: (self.v0).to_string(),
                    check_statement: "(..= 5).contains(& self.v0) || (..= 5).contains(& self.v0) ||\n(20 ..).contains(& self.v0) && (| x | x % 2 != 0) (self.v0)"
                        .to_owned(),
                    fallback: fallback.to_string(),
                });
            self.v0 = fallback;
        }
        if !((-1.0..=5.0).contains(&self.v1) || (-1.0..=5.0).contains(&self.v1)) {
            let fallback = 3.1;
            ret_vec
                .push(range_checker::Error::Fallback {
                    ident: "v1".to_owned(),
                    value: (self.v1).to_string(),
                    check_statement: "(- 1.0 ..= 5.0).contains(& self.v1) || (- 1.0 ..= 5.0).contains(& self.v1)"
                        .to_owned(),
                    fallback: fallback.to_string(),
                });
            self.v1 = fallback;
        }
        if !((|x| x > 8.0)(self.v2) && (|x| x > 8.0)(self.v2)) {
            let fallback = 9.9;
            ret_vec
                .push(range_checker::Error::Fallback {
                    ident: "v2".to_owned(),
                    value: (self.v2).to_string(),
                    check_statement: "(| x | x > 8.0) (self.v2) && (| x | x > 8.0) (self.v2)"
                        .to_owned(),
                    fallback: fallback.to_string(),
                });
            self.v2 = fallback;
        }
        if !((..-1).contains(&self.v3) || (..-1).contains(&self.v3)) {
            let fallback = (|x| {
                {
                    ::std::io::_print(
                        ::core::fmt::Arguments::new_v1(
                            &["test fallback closure.\n"],
                            &[],
                        ),
                    );
                };
                x - 5
            })(self.v3);
            ret_vec
                .push(range_checker::Error::Fallback {
                    ident: "v3".to_owned(),
                    value: (self.v3).to_string(),
                    check_statement: "(.. - 1).contains(& self.v3) || (.. - 1).contains(& self.v3)"
                        .to_owned(),
                    fallback: fallback.to_string(),
                });
            self.v3 = fallback;
        }
        if !failed { Ok(ret_vec) } else { Err(ret_vec) }
    }
}
```