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);
}
}
这段代码:
- 定义包含
email字段的User结构体 - 使用
#[validate(email)]属性声明邮箱格式验证 - 创建包含非法邮箱的实例并执行验证
- 输出验证错误信息
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();// 触发自定义验证错误
此高阶心法:
- 创建自定义验证函数
validate_password - 检查密码长度、大写字母和数字的存在
- 通过
#[validate(custom)]属性应用到结构体字段 - 返回标准化的验证错误信息
6. 秘籍出处(官方资源)
Github:github.com/Keats/valid…
Crates.io:crates.io/crates/vali…