#macro-derive #validation #error #derive #builder-pattern #path

not-so-fast

一个使用 derive 宏进行数据验证的库

2 个不稳定版本

0.2.0 2023年10月12日
0.1.0 2023年3月11日

#725数据结构

Download history 363/week @ 2024-03-13 208/week @ 2024-03-20 205/week @ 2024-03-27 271/week @ 2024-04-03 152/week @ 2024-04-10 33/week @ 2024-04-17 2/week @ 2024-04-24 6/week @ 2024-05-08 15/week @ 2024-05-15 4/week @ 2024-05-22 176/week @ 2024-05-29 417/week @ 2024-06-05 279/week @ 2024-06-12 64/week @ 2024-06-19 6/week @ 2024-06-26

每月849 次下载

MIT/Apache

40KB
598 代码行

not-so-fast

一个用于数据验证的 Rust 库。

特性

  • 用于报告验证错误的 Builder 模式 API
  • 验证器轻松组合
  • 为结构和枚举实现验证特质的 derive 宏
  • 使用类似 jq 的路径显示错误
  • 反映输入数据结构的错误序列化

安装

cargo add not-so-fast # --features derive serde

可用的 cargo 功能

  • derive - 启用 Validate derive 宏,默认禁用
  • serde - 启用 serde::SerializeValidationNode 的实现,默认禁用

用法

use not_so_fast::{Validate, ValidationNode, ValidationError};

#[derive(Validate)]
struct User {
    #[validate(custom = alpha_only, char_length(max = 30))]
    nick: String,
    #[validate(range(min = 15, max = 100))]
    age: u8,
    #[validate(length(max = 3), items(char_length(max = 50)))]
    cars: Vec<String>,
}

fn alpha_only(s: &str) -> ValidationNode {
    ValidationNode::error_if(
        s.chars().any(|c| !c.is_alphanumeric()),
        || ValidationError::with_code("alpha_only")
    )
}

let user = User {
    nick: "**tom1980**".into(),
    age: 200,
    cars: vec![
        "first".into(),
        "second".into(),
        "third".repeat(11),
        "fourth".into(),
    ],
};

let node = user.validate();
assert!(node.is_err());
assert_eq!(
    vec![
        ".age: range: Number not in range: max=100, min=15, value=200",
        ".cars: length: Invalid length: max=3, value=4",
        ".cars[2]: char_length: Invalid character length: max=50, value=55",
        ".nick: alpha_only",
    ].join("\n"),
    node.to_string()
);

指南

not-so-fast/examples/manual.rs 解释了如何编写自定义验证器。

not-so-fast/examples/derive.rs 展示了如何使用 Validator derive 宏。

与 validator 的比较

not-so-fast 尝试修复我在使用流行的 https://github.com/Keats/validator crate 时遇到的问题。这两个库的 API 类似,但不兼容。以下是 not-so-fast 的差异

  • 验证器组合 - 在 not-so-fast 中组合验证器很简单,因为所有值 - 数字、字符串、对象、列表 - 都使用相同的类型 - ValidationNode - 报告验证错误。
  • 基本验证器 - not-so-fast 只包含基本验证器。你预计将编写自定义验证器以测试数据是否符合你领域规则。
  • 枚举支持 - Validate derive 宏与结构和枚举一起工作。
  • 鸭子类型 - Validate 派生宏根本不考虑字段类型。为了验证容器内的数据,你需要向派生宏提供有关如何访问数据的提示(someitemsfields 属性)。作为回报,not-so-fast 将与具有 std-like API 的第三方容器类型一起工作。

待办事项

  • 添加 matches 派生验证器以测试字符串与正则表达式
  • 添加 is_some/required 派生验证器以测试选项
  • 考虑将派生验证器从 not-so-fast-derive 移动到 not-so-fast 以提高代码重用性

许可证

根据您的选择,在 Apache License,Version 2.0 或 MIT 许可证下授权。

除非您明确声明,否则根据 Apache-2.0 许可证定义,您有意提交以包含在此软件包中的任何贡献,均将按照上述方式双重许可,无需任何附加条款或条件。

依赖项

~0–275KB