#validation #rules #data #library

accord

根据“包含”、“长度”、“任选”和“范围”等规则验证数据的库

5 个版本

使用旧的Rust 2015

0.2.2 2017年1月19日
0.2.1 2017年1月16日
0.1.2 2017年1月16日

1528编码

MIT 许可证

21KB
252

Accord

Build Status Current Crates.io Version API Documentation codecov

Accord 是一个库,用于根据“长度”、“包含”、“范围”和“任选”等规则验证数据。

Accord 包含两部分,第一部分是一组验证函数,例如测试一个 String 是否至少有 5 个字符,或者一个 i32 是否是 1020,第二部分是 rules! 宏,它允许你在单个数据项或整个数据集合上运行一组验证器,并返回一组错误,这些错误可以清楚地说明出了什么问题。可以使用 Serde 将错误轻松序列化,然后在例如 REST API 中使用,以向用户报告用户提交的数据中包含哪些非法值。

请参阅 Rocket 示例 了解如何使用 Accord 与 Rocket 验证 JSON 输入,并将任何发生的错误作为 JSON 返回,然后由请求的应用程序解析并显示给用户,以指导他们如何根据应用程序的规则修复输入值。

错误消息使用编号占位符,这意味着错误消息可以是 "必须不小于 %1"。,伴随的列表 [5],这使得在不需要处理变量值 5 的情况下翻译 "必须不小于 %1"。 变得非常容易。

使用指南 tl;dr

#[macro_use]
extern crate accord;
extern crate serde;
extern crate serde_json;

use accord::{Accord, Result as AccordResult, Error, MultipleError, MultipleInvalid};
use accord::validators::{length, contains, range};

struct Account {
    pub name: String,
    pub email: String,
    pub age: i8,
}

impl Accord for Account {
    fn validate(&self) -> AccordResult {
        rules!{
            "name" => self.name => [length(1, 64)],
            "email" => self.email => [length(5, 64), contains("@"), contains(".")],
            "age" => self.age => [range(12, 127)]
        }
    }
}

fn main() {
    let account = Account {
        name: "".to_string(),
        email: "test".to_string(),
        age: 11,
    };

    // You can use the `rules!` macro on any value.
    // This way of using the the `rules!` macro returns a
    // `Result<(), Error>`.
    let _ = rules!(account.name, [length(1, 64)]);
    let _ = rules!(account.email, [length(5, 64), contains("@"), contains(".")]);
    let _ = rules!(account.age, [range(12, 127)]);

    // You can also use the collection form of the `rules!` macro
    // again using any value you'd like.
    // This way of using the `rules!` macro returns a
    // `Result<(), MultipleError>`. Notice the string slices that has
    // been appended to the lines from last example. These string slices
    // are called tags and are used to distingues between the sets of errors
    // that are returned.
    let _ = rules!{
        "name" => account.name => [length(1, 64)],
        "email" => account.email => [length(5, 64), contains("@"), contains(".")],
        "age" => account.age => [range(12, 127)]
    };

    // And finally, since our `Account` has implemented the
    // `Accord` trait, we can simply do the following, which once
    // again returns `Result<(), MultipleError>`, which we then
    // serialize to JSON using Serde and print:
    if let Err(multiple_error) = account.validate() {
        println!("Errors as json: {}",
                 serde_json::to_string(&multiple_error).unwrap());
    } else {
        println!("No errors occured");
    }
}

文档

  • 示例:使用示例位于 examples/ 目录中
  • API 文档:从源代码、注释和示例生成的文档

本地构建

稳定版

构建: cargo build

测试: cargo test

夜间版 + 不稳定功能

确保您已安装最新版本的 rust 夜间版。

构建: cargo build

测试: cargo test

您可以在 --features FEATURES TO ENABLE 中添加 cargo buildcargo test 以构建或测试不稳定功能。当前支持的不稳定功能包括

  • inclusive_range(包含范围)是RFC#1192 中的一部分,它允许您使用 lengthrange 验证器,用 包含范围 代替 a, b 变量,就像上面的例子一样。您可以在这里找到一个使用包含范围的示例crate。

构建

您还可以使用make 以更简单的方式完成更多任务。Makefile 要求您通过rustup 使用Rust。

  • make 将构建和测试Accord及其所有稳定和nightly版本上的示例
  • make build 将在稳定和nightly版本上构建所有内容
  • make build-stable 将在稳定版本上构建所有内容
  • make build-unstable 将在nightly版本上构建所有内容,包括和不包括不稳定功能
  • make build-examples 将在稳定和nightly版本上构建示例
  • makebuild-stable-examples
  • makebuild-unstable-examples
  • makebuild-stable-example-<NAME-OF-STABLE-EXAMPLE>
  • makebuild-unstable-example-<NAME-OF-UNSTABLE-EXAMPLE>
  • make test 将在稳定和nightly版本上测试所有内容,在nightly版本上包括和不包括不稳定功能
  • make test-stable 将在稳定版本上测试所有内容
  • make test-unstable 将在nightly版本上包括和不包括不稳定功能测试所有内容
  • make test-examples 将在稳定和nightly版本上测试示例
  • maketest-stable-examples
  • maketest-unstable-examples
  • maketest-stable-example-<NAME-OF-STABLE-EXAMPLE>
  • maketest-unstable-example-<NAME-OF-UNSTABLE-EXAMPLE>

贡献

我们绝对欢迎并鼓励贡献!贡献的形式多种多样。您可以

  1. 提交功能请求或错误报告作为问题
  2. 作为问题请求改进文档。
  3. 通过拉取请求贡献代码。

为了保持高质量标准,贡献的代码必须

  • 注释:公共项必须有注释。
  • 文档化:公开的项必须有带示例的rustdoc注释(如有适用)。
  • 格式化:您的代码应尽可能使用rustfmt进行格式化。
  • 简洁:您的代码应尽可能简单和地道地完成任务。
  • 测试:您必须为添加的任何功能添加(并通过)令人信服的测试。
  • 专注:您的代码应该只做它应该做的事情,不做其他事情。

所有拉取请求都由CI进行代码审查和测试。请注意,除非您明确说明,否则您提交给Accord的任何贡献均应被视为MIT许可证,无任何附加条款或条件。

感谢Rocket展示了如何形成优秀的贡献部分。

许可

Accord 版权所有 (c) 2017 Christoffer Buchholz。它是一款免费软件,可以在LICENSE文件中指定的条款下重新分发。

依赖项

~1.5MB
~30K SLoC