34个版本 (7个重大更改)
0.8.0 | 2023年11月3日 |
---|---|
0.6.3 | 2023年11月2日 |
#1216 in Rust模式
每月308次下载
在avocado-schema-derive中使用
91KB
2.5K SLoC
Avocado Schema
受JSON schema的启发,Avocado Schema的主要目的是避免在宏中定义静态schema或验证,因此可以使用灵活的、单独的schema,例如json字符串,来更改/检查schema,并将其保存到/从数据库中加载。同时,它还可以被解释以实现多种目的(如执行数据验证或动态生成GUI)。
如何使用
src/core/value.rs定义了一个FieldValue
枚举来实现结构值的重构,因此需要根据schema进行验证的任何结构都需要实现Reflect
特质。该文件中已包含一些有用的实现。schema derive crate提供了一个派生宏,用于为结构
派生FieldValue
。
请参考源代码/测试代码,了解如何编写访问者以及如何通过schema进行数据验证。以下是一个快速示例
#[derive(Reflect)]
struct Client {
first_name: String,
last_name: String,
age: u64,
}
let schema_json = r#"
{
"type":"object",
"name": "client",
"properties": {
"first_name": {
"type": "string",
"name": "first_name",
"max_length": 32,
"min_length": 8
},
"last_name": {
"type": "string",
"name": "last_name",
"max_length": 32,
"min_length": 8
},
"age": {
"type": "uinteger",
"name": "age",
"maximum": 200,
"minimum": 0
}
}
}"#;
let schema: ObjectField = serde_json::from_str(schema_json).unwrap();
let validator = Validator::new(schema);
let valid_client = Client {
first_name: "Robert".to_string(),
last_name: "Li".to_string(),
age: 32,
};
assert!(validator.validate(&valid_client).is_ok());
let invalid_client = Client {
first_name: "Robert".to_string(),
last_name: "Li".to_string(),
age: 201,
};
let result = validator.validate(&invalid_client);
assert!(result.is_err());
assert!(result
.err()
.unwrap()
.get("client/age")
.unwrap()
.get(0)
.unwrap()
.message
.contains("value 201 is larger then 200 (Maximum)"));
}
如果发生任何错误,错误将以BTreeMap<String, Vec<ValidationError>>
格式返回。键是具有验证错误的字段的路径,而ValidationError
仅包含错误消息。
除了基于json创建schema外,还实现了builder
模式,通过代码构建schema。
依赖关系
~7–10MB
~170K SLoC