2个版本

使用旧的Rust 2015

0.1.1 2016年5月22日
0.1.0 2016年5月22日

#268 in 电子邮件

MIT 许可证

18KB
293

validations

Crate validations 提供了一个接口来检查任意类型的有效性。

概述

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()
);

许可证

MIT

没有运行时依赖