14 个版本 (4 个重大更新)
0.5.2 | 2024年6月11日 |
---|---|
0.4.1 | 2024年5月12日 |
0.3.0 | 2023年11月9日 |
#280 in 编码
每月下载量 57 次
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