2 个不稳定版本
0.2.0 | 2023年10月12日 |
---|---|
0.1.0 | 2023年3月11日 |
#725 在 数据结构
每月849 次下载
40KB
598 代码行
not-so-fast
一个用于数据验证的 Rust 库。
特性
- 用于报告验证错误的 Builder 模式 API
- 验证器轻松组合
- 为结构和枚举实现验证特质的 derive 宏
- 使用类似
jq
的路径显示错误 - 反映输入数据结构的错误序列化
安装
cargo add not-so-fast # --features derive serde
可用的 cargo 功能
derive
- 启用Validate
derive 宏,默认禁用serde
- 启用serde::Serialize
对ValidationNode
的实现,默认禁用
用法
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
派生宏根本不考虑字段类型。为了验证容器内的数据,你需要向派生宏提供有关如何访问数据的提示(some
、items
、fields
属性)。作为回报,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