Rust兵器谱|护身符:validator

528 阅读2分钟

1. 江湖溯源(背景介绍)

在编程江湖中,数据验证如同护身符般守护着应用程序的安危。validator 正是 Rust 江湖中一款轻量级验证神器,专为结构体字段验证而生。其以宏和特性(trait)为核心,支持声明式验证规则,可轻松实现邮箱格式、字符串长度、数值范围等常见校验,更支持自定义验证规则,堪称数据安全的贴身护卫。

2. 武学妙用(应用场景)

  • 表单数据合法性校验(如用户注册信息)
  • API 接口参数有效性验证
  • 配置文件完整性检查
  • 数据库写入前的数据合规性审查
  • 跨系统数据交换时的格式保障

3. 兵器锻造(依赖引入)

Cargo.toml 中添加以下配置(根据需求选择特性):

[dependencies]
# 基础验证功能# 
validator = { version = "0.16", features = ["derive"] }
# 包含电话号码验证
validator = { version = "0.16", features = ["derive", "phone"] }
# 包含URL验证  
validator = { version = "0.16", features = ["derive", "url"] }    

4. 初窥门径(5分钟上手)

a. 基本招式(Hello World)

use validator::Validate;

// 定义需要验证的结构体
#[derive(Debug, Validate)]
struct User {
    #[validate(email)]// 声明邮箱格式验证
    email: String,
}

fn main() {
    let user = User {
        email: "invalid-email".to_string(),
    };

// 执行验证
    if let Err(errors) = user.validate() {
        println!("验证错误: {:?}", errors);
    }
}

这段代码:

  1. 定义包含 email 字段的 User 结构体
  2. 使用 #[validate(email)] 属性声明邮箱格式验证
  3. 创建包含非法邮箱的实例并执行验证
  4. 输出验证错误信息

b. 十八般武艺(功能示例)

招式一:范围限制验证

#[derive(Validate)]
struct Product {
    #[validate(range(min = 1, max = 100))]
    stock: i32,
}

let p = Product { stock: 105 };
p.validate().unwrap_err();// 触发库存超限错误

招式二:字符串长度校验

#[derive(Validate)]
struct Post {
    #[validate(length(min = 10, max = 1000))]
    content: String,
}

let post = Post { content: "Hi".to_string() };
post.validate().unwrap_err();// 内容过短

招式三:正则表达式匹配

#[derive(Validate)]
struct Employee {
    #[validate(regex(path = "PHONE_REGEX"))]
    phone: String,
}

lazy_static! {
    static ref PHONE_REGEX: Regex = Regex::new(r"^\\d{3}-\\d{8}$").unwrap();
}

let emp = Employee { phone: "123-1234567".to_string() };
emp.validate().unwrap();// 符合格式要求

c. 心法进阶(高级用法)

自定义密码强度验证:

use validator::{Validate, ValidationError};

fn validate_password(password: &str) -> Result<(), ValidationError> {
    let mut has_upper = false;
    let mut has_digit = false;

    for c in password.chars() {
        if c.is_uppercase() { has_upper = true; }
        if c.is_ascii_digit() { has_digit = true; }
    }

    if !has_upper || !has_digit || password.len() < 8 {
        return Err(ValidationError::new("密码需包含大写字母、数字且至少8位"));
    }
    Ok(())
}

#[derive(Validate)]
struct Account {
    #[validate(custom(function = "validate_password"))]
    password: String,
}

let acc = Account { password: "weakpass".to_string() };
acc.validate().unwrap_err();// 触发自定义验证错误

此高阶心法:

  1. 创建自定义验证函数 validate_password
  2. 检查密码长度、大写字母和数字的存在
  3. 通过 #[validate(custom)] 属性应用到结构体字段
  4. 返回标准化的验证错误信息

6. 秘籍出处(官方资源)

Githubgithub.com/Keats/valid…

Crates.iocrates.io/crates/vali…