Rust数据验证库validit的使用,validit提供高效灵活的数据校验和验证功能
Rust数据验证库validit的使用
validit是一个Rust库,用于在变量被访问时验证其内部状态。
主要功能
- 为类型
T
实现Validate
trait来定义如何验证T
的内部状态 - 包装结构体
Valid<T: Validate>
实现了Deref
和DerefMut
trait,并在变量被访问时验证内部状态
示例代码
以下是内容中提供的示例代码:
struct Foo(u64);
impl validit::Validate for Foo {
fn validate(&self) -> Result<(), Box<dyn std::error::Error>> {
validit::less!(self.0, 5);
Ok(())
}
}
fn main() {
let v1 = Valid::new(Foo(1));
let _x = v1.0; // Good.
let v6 = Foo(6);
let _x = v6.0; // No panic without validation.
let v6 = Valid::new(Foo(6));
let _x = v6.0; // panic: panicked at 'invalid state: expect: self.0(6) < 5(5) ...
}
完整示例demo
以下是一个更完整的示例,展示了如何使用validit进行数据验证:
use validit::{Validate, Valid, less, greater};
// 定义一个需要验证的结构体
#[derive(Debug)]
struct User {
id: u64,
age: u8,
name: String,
}
// 为User实现Validate trait
impl Validate for User {
fn validate(&self) -> Result<(), Box<dyn std::error::Error>> {
// 验证ID必须大于0
greater!(self.id, 0);
// 验证年龄必须在1到120之间
greater!(self.age, 0);
less!(self.age, 120);
// 验证名字不能为空
if self.name.is_empty() {
return Err("Name cannot be empty".into());
}
Ok(())
}
}
fn main() {
// 创建一个有效的用户
let valid_user = Valid::new(User {
id: 1,
age: 25,
name: "Alice".to_string(),
});
// 访问用户数据 - 不会panic
println!("Valid user: {:?}", valid_user);
// 创建一个无效的用户(年龄超出范围)
match Valid::new(User {
id: 2,
age: 150,
name: "Bob".to_string(),
}) {
Ok(_) => println!("This should not happen"),
Err(e) => println!("Validation failed: {}", e),
}
// 创建一个无效的用户(名字为空)
match Valid::new(User {
id: 3,
age: 30,
name: "".to_string(),
}) {
Ok(_) => println!("This should not happen"),
Err(e) => println!("Validation failed: {}", e),
}
}
验证宏
validit提供了一些方便的验证宏:
less!(value, bound)
- 验证值必须小于boundgreater!(value, bound)
- 验证值必须大于boundless_eq!(value, bound)
- 验证值必须小于或等于boundgreater_eq!(value, bound)
- 验证值必须大于或等于bound
特点
- 高效:只在数据被访问时进行验证
- 灵活:可以自定义任何验证逻辑
- 安全:确保数据始终处于有效状态
- 易用:通过简单的trait实现和宏提供验证功能
安装
在Cargo.toml中添加依赖:
validit = "0.2.4"
validit库适用于需要确保数据一致性的场景,特别是在构建领域模型或处理用户输入时非常有用。