#validation #macro-derive #macro #derive #builder

valibuk

Valibuk 是一个库和一组宏,实现了正确构建模式

2 个不稳定版本

0.2.0 2023年4月11日
0.1.0 2023年3月1日

#2746 in Rust 模式

MIT/Apache

8KB

Valibuk

Valibuk 是一个库和一组宏,实现了正确构建模式。

正确构建模式是一种利用类型系统来防止因不正确验证输入而产生的错误模式的模式。它通过有一个“未验证”的类型和一个“验证”的类型来实现。获得验证类型实例的唯一方法是在未验证的类型上运行所有定义的验证。然后通过使用正确的类型来实现正确性。

一个小例子

https://github.com/mirosval/valibuk/blob/c78d7578bac0d46874496fe9fd4bdb4b88b06220/examples/minimal.rs#L3-L25

testsexamples 中查看更多示例。

待办事项

  • 将验证器注册移动到宏注解中
  • 支持无需验证的字段
  • 使用 trybuild 添加 UI 测试
  • 支持带生命周期参数的结构体
  • 支持泛型结构体
  • 支持全局验证器(获取整个结构体)
  • 添加验证器组合器

lib.rs:

无需样板代码的正确构建验证器

正确构建模式是一种利用类型系统来防止因不正确验证输入而产生的错误模式的模式。它通过有一个“未验证”的类型和一个“验证”的类型来实现。获得验证类型实例的唯一方法是在未验证的类型上运行所有定义的验证。然后通过使用正确的类型来实现正确性。

最小示例

use valibuk::Validated;

// 1. Having a T -> Result<T, E> validator
fn is_positive(i: i32) -> Result<i32, String> {
    if i > 0 {
        Ok(i)
    } else {
        Err("wrong".to_string())
    }
}

// 3. Derive (1) the `unvalidated` type and a `std::convert::TryFrom` trait
#[derive(Validated)]
// 2. And a struct
struct A {
    #[validator(is_positive)] // Apply the function from (1) as validator
    a: i32,
}

fn main() {
    let i: i32 = 1;
    // 4. Construct the instance of the original type from the unvalidated version
    let a = A::try_from(UnvalidatedA { a: i }).expect("valid instance");
    assert_eq!(a.a, i);
}

教程

  1. 使用 #[derive(Validated)] 来标记您在代码中想要使用的结构体
  2. 使用 #[validator(<fn_name>)] 标记您想要验证的任何字段,其中 fn_name 指的是作用域中已经存在的验证器函数。此函数应具有以下形式: fn(T) -> Result<T, E> 其中 T 是正在验证的字段类型,而 E 是您希望使用的错误类型
  3. 要实际构建您结构体的实例,请使用 A::try_from(UnvalidatedA { ... }),其中 A 是您的结构体。

指定自己的错误类型

默认情况下,try_from 返回的错误类型是 Vec<String>,这也会强制验证函数返回 Result<T, String>

您可以使用 #[validation_error(MyValidationError)] 属性注解来插入您自己的错误类型。

依赖关系

~1.5MB
~36K SLoC