#schema-validation #json-schema #schema #reflection #validation #macro-derive

avocado-schema

一个可被解释以实现多种目的的schema DSL

34个版本 (7个重大更改)

0.8.0 2023年11月3日
0.6.3 2023年11月2日

#1216 in Rust模式

Download history 2/week @ 2024-06-11

每月308次下载
avocado-schema-derive中使用

MIT许可证

91KB
2.5K SLoC

Avocado Schema

受JSON schema的启发,Avocado Schema的主要目的是避免在宏中定义静态schema或验证,因此可以使用灵活的、单独的schema,例如json字符串,来更改/检查schema,并将其保存到/从数据库中加载。同时,它还可以被解释以实现多种目的(如执行数据验证或动态生成GUI)。

Crates.io MIT licensed codecov

如何使用

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