Crates.io | range_checker |
lib.rs | range_checker |
version | 0.2.2 |
source | src |
created_at | 2023-01-03 11:42:59.684651 |
updated_at | 2023-12-22 15:28:55.132744 |
description | derive-macro crate aimed to provide declarative bounds checking and filtering for structure. |
homepage | |
repository | https://github.com/TYPEmber/range_checker.git |
max_upload_size | |
id | 750087 |
size | 18,902 |
range_checker is a derive-macro crate aimed to provide declarative bounds checking and filtering for structure.
use range_checker::Check;
#[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,
#[filter(|x:&str| !x.is_empty())]
v4: String,
}
fn main() {
let a = TestStruct::default();
if let Ok(_) = a.check() {
todo!{}
}
}
Use #[range(...)]
to detemine the range for named struct's field.
Multiple #[range(...)]
will combined by ||
, which allowed to config any range you need.
Use #[filter(#closure)]
to filter for named struct's field, #closure: |#type_of_field| -> bool
.
Multiple #[filter(#closure)]
will combined by &&
.
#[filter(#closure)]
will combined with #[range(...)]
by &&
.
Active with the
fn check_with_callback()
Use #[fallback(#closure|#lit)]
to set fallback behavior for named struct's field, #closure: |#type_of_field| -> #type_of_field
.
One field brokes it's range or filter with fallback attribute setted, fn check_with_fallback()
will return Ok(_)
.
range_checker::Check
will return Err(())
immediately any field broke it's range or filter.
range_checker::CheckVerbose
will check all fields and return detail information like Err(Vec<Error>)
or Ok(Vec<Error>)
when all of broken fields has a fallback attribute.
Here(https://github.com/TYPEmber/range_checker/tree/master/examples/expand_code.md) is an Expand Example for
use range_checker::Check;
use range_checker::CheckVerbose;
#[derive(Debug, Default, CheckVerbose)]
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,
}