13个版本
0.6.2 | 2023年10月1日 |
---|---|
0.6.1 | 2022年3月10日 |
0.5.0 | 2021年10月15日 |
0.4.0 | 2020年12月24日 |
0.3.2 | 2020年5月7日 |
#214 in 编码
9,798 每月下载量
在 4 个crate中使用了 (3 直接)
175KB
3.5K SLoC
cddl-cat
是一个库,用于验证编码数据与描述数据预期结构的CDDL文档。
CDDL是一个由 RFC8610 描述的文本文档,用于描述数据结构。CDDL不依赖于任何特定的序列化或编码方法;它可以用于验证CBOR或JSON格式的数据。
此库的目标是使CBOR或JSON数据轻松地与CDDL模式描述进行验证。
cddl-cat
支持 Rust 1.48 及以上版本。
实现细节
-
支持CBOR和JSON编码,由
serde_cbor
和serde_json
功能控制。 -
从CDDL AST构建一个“中间验证树” (
ivt
);这去除了部分CDDL语法细节,结果是一个可以更容易验证的简化树。IVT几乎完全由Node
元素组成,允许递归验证。 -
通过首先将传入的数据转换为通用形式,执行验证,因此大多数验证代码对序列化格式完全无感知。
-
验证代码使用一个
LookupContext
对象来执行所有规则查找。这将允许堆叠CDDL文档或构建其他CDDL模式可使用的CDDL库。将来,可以通过更改LookupContext
配置来自定义验证过程。 -
全面测试(90%+覆盖率)。
示例
此示例验证JSON编码数据与CDDL模式
use cddl_cat::validate_json_str;
let cddl_input = "person = {name: tstr, age: int}";
let json_str = r#"{ "name": "Bob", "age": 43 }"#;
validate_json_str("person", cddl_input, &json_str).unwrap();
如果JSON数据没有预期的结构,将产生错误
use cddl_cat::validate_json_str;
let cddl_input = "person = {name: tstr, age: int}";
let json_str = r#"{ "name": "Bob", "age": "forty three" }"#;
assert!(validate_json_str("person", cddl_input, &json_str).is_err());
类似的示例,验证CBOR编码数据与CDDL模式
use cddl_cat::validate_cbor_bytes;
use serde::Serialize;
#[derive(Serialize)]
struct PersonStruct {
name: String,
age: u32,
}
let input = PersonStruct {
name: "Bob".to_string(),
age: 43,
};
let cbor_bytes = serde_cbor::to_vec(&input).unwrap();
let cddl_input = "person = {name: tstr, age: int}";
validate_cbor_bytes("person", cddl_input, &cbor_bytes).unwrap();
支持的预定义类型
any
,uint
,nint
,int
,bstr
,bytes
,tstr
,text
float
、float16
、float32
、float64
、float16-32
、float32-64
注意:float的大小未进行验证。
支持CDDL功能
- 基本预置类型(整数、浮点数、布尔值、nil、文本字符串、字节字符串)
- 字面量int、float、bool、UTF-8文本字符串
- UTF-8、十六进制或base64的字节字符串
- 数组和映射
- 按名称进行规则查找
- 组
- 选择(使用
/
或//
语法) - 出现次数(
?
、*
、+
或m*n
) - 范围(例如
1..7
或1...8
) - 解包(
~
) - 将组转换为选择(
&
) - 使用裁剪语法(
^ =>
)的映射键 - 泛型类型
- 控制运算符
.cbor
、.size
和.regexp
未实现的CDDL功能
- 使用
/=
扩展类型 - 使用
//=
扩展组 - 使用
$
的类型插座 - 使用
$$
的组插座 - 除上述之外的其它控制运算符(例如
.bits
、.lt
、.gt
等) - 使用
&
的组枚举 - 使用
#
的标记数据 - 十六进制浮点字面量(例如
0x1.921fb5p+1
) - 调用CBOR标记的预置类型(例如
tdate
或biguint
)
依赖项
~5-7MB
~126K SLoC