15个版本
0.1.14 | 2024年8月3日 |
---|---|
0.1.13 | 2024年8月3日 |
0.1.12 | 2024年7月31日 |
#1038 in 编码
每月1,382次下载
用于 3 crates
24KB
441 代码行
ESExpr
ESExpr是一种序列化格式,由以下形式的表达式组成。
- 具有名称和位置参数和关键字参数的构造函数。
- 布尔值
- 整数
- 字符串
- 二进制数据
- Float32/64
- 空值
构造函数和关键字名称存储在字符串表中以避免重复。字符串表可以内部或外部存储。每种类型都有自己的标签与之关联。构造函数标签包括构造函数名称。
推导
可以推导出ESExprCodec
特质。
#[derive(ESExprCodec, Copy, Debug, PartialEq)]
struct MyStruct {
pub a: String,
}
#[derive(ESExprCodec, Copy, Debug, PartialEq)]
struct MyEnum {
A(String),
B(i32),
}
默认情况下,结构体、枚举情况和字段名称被转换为kebab-case。在上面的示例中,MyStruct
具有构造函数my-struct
,而MyEnum
具有构造函数a
和b
。这可以通过使用constructor
属性进行自定义。
#[derive(ESExprCodec, Copy, Debug, PartialEq)]
#[constructor = "my-ctor"]
struct MyStruct {
pub a: String,
}
#[derive(ESExprCodec, Copy, Debug, PartialEq)]
struct MyEnum {
#[constructor = "a2"]
A(String),
B(i32),
}
在某些情况下,对于枚举情况,构造函数的编码开销可能是不希望的。在这种情况下,可以使用inline_value
直接编码一个情况。仅允许单个字段。用户负责确保标签不与其他任何情况重叠。
#[derive(ESExprCodec, Copy, Debug, PartialEq)]
struct MyEnum {
#[inline_value]
A(String),
B(i32),
}
对于更简单的情况,可以通过添加simple_enum
将字符串值用作enum
。每个构造函数名称被编码为字符串值。任何情况下都不允许指定字段。
#[derive(ESExprCodec, Copy, Debug, PartialEq)]
#[simple_enum]
struct MyEnum {
A,
B,
}
默认情况下,字段指定位置参数。要定义关键字参数,请使用keyword
。如果将required
设置为false
,则可以省略关键字参数。此外,可以使用default_value
设置默认值。
#[derive(ESExprCodec, Copy, Debug, PartialEq)]
struct MyStruct {
#[keyword]
a: bool,
#[keyword = "b2"]
b: bool,
#[keyword(name = "c2")]
c: bool,
#[keyword(name = "d2", required = false)]
d: Option<bool>,
#[keyword(required = false, name = "e2")]
e: Option<bool>,
#[keyword(required = false)]
f: Option<bool>,
#[keyword]
#[default_value = false]
g: bool,
#[keyword]
h: Option<bool>,
}
要处理多个参数,可以使用vararg
和dict
分别用于位置参数和关键字参数。
#[derive(ESExprCodec, Copy, Debug, PartialEq)]
struct MyStruct {
#[vararg]
args: Vec<bool>,
#[dict]
kwargs: std::collections::HashMap<String, bool>,
}
依赖关系
~2.9–4.5MB
~81K SLoC