#validation #fluent #error #renamed #check #assayer #superceded

已删除 fluent_validator

库重命名并由 assayer 库取代。请检查 > https://crates.io/crates/assayer

使用旧的 Rust 2015

0.1.2 2017年9月1日
0.1.0 2017年6月29日

#55 in #fluent


3 个库使用(2 直接使用)

MIT/Apache

10KB
89

弃用通知

fluent_validator 库已被删除。它已被 assayer 库取代,具有相同的零开销实现,但还提供了 ref, mut ref 和 move 验证器以及完整文档。

原始文档

fluent_validator 是为了允许您以命令式或流畅(链式方法功能性)风格指定一组验证规则而创建的,同时充分利用 Rust 的编译时优化。

** 快速入门 **

  1. 将 fluent_validator 添加到 Cargo.toml 的 [dependencies] 部分。
    • 如果您尚未使用 cargo edit,您应该使用它。安装后,只需在命令行中键入 cargo add fluent_validator 即可完成此步骤。
  2. extern crate fluent_validator; 添加到您的库根文件中(无论是 lib.rs 还是 main.rs)。
  3. 定义您的验证器(见下文)
  4. 调用您的验证器以享受乐趣和利润!(见下文)

*** 简单验证器场景 *** 假设您正在编写一个需要当被调用时提供一个参数的命令行程序。您将定义您的验证器以确保恰好提供一个参数。这意味着参数的数量必须是 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);

无运行时依赖