2个版本
使用旧的Rust 2015
0.1.1 | 2016年5月22日 |
---|---|
0.1.0 | 2016年5月22日 |
#268 in 电子邮件
18KB
293 行
validations
Crate validations
提供了一个接口来检查任意类型的有效性。
- validations 在crates.io
- 文档 对于最新的crates.io版本
概述
Validate
trait 提供了 validate
方法,该方法执行任意验证逻辑并返回一个结果,表示该值是否有效。返回值 Ok(())
表示有效值。返回值 Err(Errors)
表示无效值,并包含值验证失败的原因的详细信息。
Errors
是一个容器,可以同时包含无效值的通用和字段特定的验证错误。单个验证错误由 Error
表示,它包含一个可读的错误消息,以及包含有关错误额外上下文的程序员可选的类型。
实现 Validate
的类型应该根据需要处理其每个字段的验证逻辑。如果一个字段的类型本身实现了 Validate
,则也可以委派给字段自行验证,并将任何生成的错误返回给父类型的错误。
除了实现 Validate
之外,另一种方法是将在类型 T
的构造函数中实现验证逻辑,并返回 Result<T, Errors>
,从而防止创建无效值。这并不总是可能的,因为值可能通过其他方式创建。例如,值可能来自外部源(如JSON)的反序列化。在这种情况下,Validate
trait 允许反序列化逻辑与领域级别的验证逻辑解耦。
示例
验证一个值
let entry = AddressBookEntry {
cell_number: None,
email: Some(Email("[email protected]")),
home_number: Some(PhoneNumber {
area_code: "555",
number: "555-5555",
}),
name: "Rust Cohle",
};
assert!(entry.validate().is_ok());
使用非字段特定错误验证一个值
let entry = AddressBookEntry {
cell_number: None,
email: Some(Email("[email protected]")),
home_number: None,
name: "Rust Cohle",
};
let errors = entry.validate().err().unwrap();
assert_eq!(
errors.base().unwrap()[0].message(),
"at least one phone number is required".to_string()
);
使用字段错误验证一个值
let entry = AddressBookEntry {
cell_number: None,
email: Some(Email("[email protected]")),
home_number: Some(PhoneNumber {
area_code: "555",
number: "555-5555",
}),
name: "",
};
let errors = entry.validate().err().unwrap();
assert_eq!(
errors.field("name").unwrap().base().unwrap()[0].message(),
"can't be blank".to_string()
);