#input-validation #validation #ergonomics #serde #error-message

valitron

Valitron 是一个易用、功能强大且可配置的验证器

14 个版本 (4 个重大更新)

0.5.2 2024年6月11日
0.4.1 2024年5月12日
0.3.0 2023年11月9日

#280 in 编码

Download history 318/week @ 2024-04-17 7/week @ 2024-04-24 142/week @ 2024-05-08 168/week @ 2024-05-15 189/week @ 2024-05-22 13/week @ 2024-05-29 87/week @ 2024-06-05 43/week @ 2024-06-12 1/week @ 2024-06-19 1/week @ 2024-06-26 14/week @ 2024-07-03 50/week @ 2024-07-24 7/week @ 2024-07-31

每月下载量 57 次

MIT/Apache

215KB
6K SLoC

Valitron 是一个易用、功能强大且可配置的验证器

未来将支持模块化

灵感来自 axum

特性

  • 易用性验证
  • 内置规则,例如 Required, StartWith ...
  • 闭包验证
  • 相关验证,例如密码确认
  • 使用其他参数的定制规则
  • 检查/修改输入数据
  • 定制错误消息类型
  • 支持不同错误类型转换,可以同时使用内置规则和自定义错误类型
  • 收集验证错误消息
  • 支持所有类型数据在 #[derive(Serialize, Deserialize)] 上 (更多信息请访问 serde)

示例 1

fn main() {
    let validator = Validator::new()
        .rule("name", Required.and(StartWith("hello")))
        .rule("age", custom(age_limit))
        .message([
            ("name.required", "name is required"),
            ("name.start_with", "name should be starts with `hello`"),
        ]);

    let person = Person {
        name: "li",
        age: 18,
    };

    let res = validator.validate(person);
    // or using trait
    let res = person.validate(validator);
}

fn age_limit(n: &mut u8) -> Result<(), Message> {
    if *n >= 25 && *n <= 45 {
        return Ok(());
    }
    Err("age should be between 25 and 45".into())
}

示例 2

use valitron::register::string::Validator;
impl Input {
    fn new(mut input: Input) -> Result<Self, Validator<Message>> {
        let valid = Validator::new()
            .insert("name", &mut input.name, Trim.and(Required))
            .insert("email", &mut input.email, Trim.and(Required).and(Email))
            .insert("gender", &mut input.gender, custom(validate_gender))
            .insert(
                "password",
                &mut input.password,
                Trim.custom(validate_password),
            )
            .insert_fn("age", || {
                if input.age < 10 {
                    input.age = 10;
                }
                if input.age > 18 {
                    Err(Message::fallback("age is out of range"))
                } else {
                    Ok(())
                }
            });

        valid.validate(input)
    }
}
fn validate_password(pass: &mut String) -> Result<(), Message> {
    todo!()
}

fn validate_gender(gender: &mut String) -> Result<(), Message> {
    Ok(())
}

文档

规则使用

用法 描述
Required 一个规则
Required.(StartsWith("foo")) 多个规则
Required.(StartsWith('a')).bail() 多个规则和 bail
自定义(my_handler) 自定义处理规则
Required.自定义(my_handler) 规则和处理规则
Not(StartsWith("foo")) 负规则
Required.(Not(StartsWith("foo"))) 负规则

基准测试

第二个方案 validator (其他库)
192.55 ns 680.43 ns

许可证

许可协议为 Apache License, Version 2.0 或 MIT license,任选其一。
除非您明确声明,否则您有意提交的任何贡献,根据 Apache-2.0 许可协议定义,将按上述方式双重许可,不附加任何额外条款或条件。

依赖

~0.1–1MB
~22K SLoC