#range #filter #check

range_checker_macro

derive-macro crate旨在为结构提供声明性边界检查和过滤。

4 个版本

0.2.2 2023年12月22日
0.2.1 2023年3月14日
0.2.0 2023年1月4日
0.1.0 2023年1月3日

#1384过程宏


用于 range_checker

MIT/Apache

13KB
272

crates.io

range_checker

range_checker是一个derive-macro crate,旨在为结构提供声明性边界检查和过滤。

示例

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!{}
    }
}

功能

range

使用 #[range(...)] 来确定命名结构的字段的范围。

多个 #[range(...)] 将通过 || 组合,允许配置所需的任何范围。

filter

使用 #[filter(#closure)] 对命名结构的字段进行过滤,#closure: |#type_of_field| -> bool

多个 #[filter(#closure)] 将通过 && 组合。

#[filter(#closure)]将与#[range(...)]通过&&结合。

回退

使用fn check_with_callback()激活

使用#[fallback(#closure|#lit)]为命名结构体的字段设置回退行为,#closure: |#type_of_field| -> #type_of_field

如果一个字段因设置了回退属性而打破了它的范围或过滤器,fn check_with_fallback()将返回Ok(_)


检查或检查详尽

range_checker::Check在任何字段打破了它的范围或过滤器时将立即返回Err(())

range_checker::CheckVerbose将检查所有字段,并在所有损坏的字段都设置了回退属性时返回详细信息,如Err(Vec<Error>)Ok(Vec<Error>)


展开示例

这里(https://github.com/TYPEmber/range_checker/tree/master/examples/expand_code.md)是展开示例

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,
}

依赖项

~1.5MB
~36K SLoC