#range #filter #check

range_checker

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

6 个版本

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

Rust 模式 中排名第 493

每月下载 24

MIT/Apache

7KB
54

crates.io

range_checker

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

示例

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(_)


检查或 CheckVerbose

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
~34K SLoC