5 个版本
使用旧的Rust 2015
0.2.2 | 2017年1月19日 |
---|---|
0.2.1 | 2017年1月16日 |
0.1.2 | 2017年1月16日 |
1528 在 编码
21KB
252 行
Accord
Accord 是一个库,用于根据“长度”、“包含”、“范围”和“任选”等规则验证数据。
Accord 包含两部分,第一部分是一组验证函数,例如测试一个 String
是否至少有 5 个字符,或者一个 i32
是否是 10 或 20,第二部分是 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");
}
}
文档
本地构建
稳定版
构建: cargo build
测试: cargo test
夜间版 + 不稳定功能
确保您已安装最新版本的 rust 夜间版。
构建: cargo build
测试: cargo test
您可以在 --features FEATURES TO ENABLE
中添加 cargo build
和 cargo test
以构建或测试不稳定功能。当前支持的不稳定功能包括
inclusive_range
(包含范围)是RFC#1192 中的一部分,它允许您使用length
和range
验证器,用 包含范围 代替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>
贡献
我们绝对欢迎并鼓励贡献!贡献的形式多种多样。您可以
为了保持高质量标准,贡献的代码必须
- 注释:公共项必须有注释。
- 文档化:公开的项必须有带示例的rustdoc注释(如有适用)。
- 格式化:您的代码应尽可能使用
rustfmt
进行格式化。 - 简洁:您的代码应尽可能简单和地道地完成任务。
- 测试:您必须为添加的任何功能添加(并通过)令人信服的测试。
- 专注:您的代码应该只做它应该做的事情,不做其他事情。
所有拉取请求都由CI进行代码审查和测试。请注意,除非您明确说明,否则您提交给Accord的任何贡献均应被视为MIT许可证,无任何附加条款或条件。
感谢Rocket展示了如何形成优秀的贡献部分。
许可
Accord 版权所有 (c) 2017 Christoffer Buchholz。它是一款免费软件,可以在LICENSE文件中指定的条款下重新分发。
依赖项
~1.5MB
~30K SLoC