Rust数据验证库validit的使用,validit提供高效灵活的数据校验和验证功能

Rust数据验证库validit的使用

validit是一个Rust库,用于在变量被访问时验证其内部状态。

主要功能

  1. 为类型T实现Validate trait来定义如何验证T的内部状态
  2. 包装结构体Valid<T: Validate>实现了DerefDerefMut 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) - 验证值必须小于bound
  • greater!(value, bound) - 验证值必须大于bound
  • less_eq!(value, bound) - 验证值必须小于或等于bound
  • greater_eq!(value, bound) - 验证值必须大于或等于bound

特点

  1. 高效:只在数据被访问时进行验证
  2. 灵活:可以自定义任何验证逻辑
  3. 安全:确保数据始终处于有效状态
  4. 易用:通过简单的trait实现和宏提供验证功能

安装

在Cargo.toml中添加依赖:

validit = "0.2.4"

validit库适用于需要确保数据一致性的场景,特别是在构建领域模型或处理用户输入时非常有用。


回到顶部