使用旧的 Rust 2015
0.1.2 |
|
---|---|
0.1.0 |
|
#55 in #fluent
10KB
89 行
弃用通知
fluent_validator
库已被删除。它已被 assayer 库取代,具有相同的零开销实现,但还提供了 ref, mut ref 和 move 验证器以及完整文档。
原始文档
fluent_validator
是为了允许您以命令式或流畅(链式方法功能性)风格指定一组验证规则而创建的,同时充分利用 Rust 的编译时优化。
** 快速入门 **
- 将 fluent_validator 添加到 Cargo.toml 的 [dependencies] 部分。
- 如果您尚未使用 cargo edit,您应该使用它。安装后,只需在命令行中键入
cargo add fluent_validator
即可完成此步骤。
- 如果您尚未使用 cargo edit,您应该使用它。安装后,只需在命令行中键入
- 将
extern crate fluent_validator;
添加到您的库根文件中(无论是lib.rs
还是main.rs
)。 - 定义您的验证器(见下文)
- 调用您的验证器以享受乐趣和利润!(见下文)
*** 简单验证器场景 *** 假设您正在编写一个需要当被调用时提供一个参数的命令行程序。您将定义您的验证器以确保恰好提供一个参数。这意味着参数的数量必须是 2(在大多数常见环境中,操作系统会自动作为第一个参数提供应用程序的名称)。为了简单起见,假设您已收集传递给应用程序的命令行参数,确保它们是有效的 UTF-8,并将它们作为一系列元素存储在 Vec 中
use fluent_validator::Error as FluentValidatorError;
impl Validator<bool> for Vec<String> {
fn validate(value: Vec<String>) -> Result<bool, FluentValidatorError> {
Ok(value)
//Determine if the vector received contains exactly two elements
.and_then(|v| match v.len() == 2 {
true => Ok(v),
false => Err(FluentValidatorError::InvalidSize), //Or add your own custom `enum` to `Error` in `src/error.rs`
})
//value passes validation
.and_then(|v| Ok(v))
*** 3 阶段验证器示例 ***
可变验证器需要拥有数据类型(例如 String)
impl Validator<String> for Base64ByteString {
fn validate(value: String) -> Result<String> {
Ok(value)
//value contains data?
.and_then(|v| match !v.is_empty() {
true => Ok(v),
false => Err(Error::EmptyValue(VAL_ERR_EMPTY_VALUE.to_string())),
})
//ensure value defines whole bytes (contains a multiple-of-three number of base-64 digits)
.and_then(|v| v += "=="[..v.len() % 3])
//value contains only valid base-64 characters?
.and_then(|v| match v.chars()
.all(|c| c.is_hex_char()) {
true => Ok(v),
false => Err(Error::IllegalValue((VAL_ERR_ILLEGAL_BASE_64_DIGIT.to_string()))),
})
//value passes validation
.and_then(|v| Ok(v))
}
}
非可变验证器可以使用任何数据类型
impl<T: AsRef<str>> Validator<T> for HexByteString {
fn validate(value: T) -> Result<T> {
Ok(value.as_ref())
//value contains data?
.and_then(|v| match !v.is_empty() {
true => Ok(v),
false => Err(Error::EmptyValue(VAL_ERR_EMPTY_VALUE.to_string())),
})
//value defines whole bytes (contains an even number of hex digits)?
.and_then(|v| match v.len() % 2 == 0 {
true => Ok(v),
false => Err(Error::InvalidSize(VAL_ERR_INVALID_SIZE.to_string())),
})
//value contains only valid hexadecimal characters?
.and_then(|v| match v.chars()
.all(|c| c.is_hex_char()) {
true => Ok(v),
false => Err(Error::IllegalValue((VAL_ERR_ILLEGAL_HEX_DIGIT.to_string()))),
})?;
Ok(value)
}
}
如下调用验证器
let hex_value = "123456";
let base_64_value = "123456";
// Method syntax
let hex_result1 = hex_value.validate::<HexByteString>();
let base_64_result1 = base_64_value.validate::<Base64ByteString>();
// Function syntax
let hex_result2 = Validate::<HexByteString>(hex_value);
let base_64_result2 = Validate::<Base64ByteString>(base_64_value);