15个版本

0.1.14 2024年8月3日
0.1.13 2024年8月3日
0.1.12 2024年7月31日

#1038 in 编码

Download history 192/week @ 2024-07-01 239/week @ 2024-07-08 462/week @ 2024-07-15 492/week @ 2024-07-22 364/week @ 2024-07-29 48/week @ 2024-08-05

每月1,382次下载
用于 3 crates

Apache-2.0

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具有构造函数ab。这可以通过使用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>,
}

要处理多个参数,可以使用varargdict分别用于位置参数和关键字参数。

#[derive(ESExprCodec, Copy, Debug, PartialEq)]
struct MyStruct {
    #[vararg]
    args: Vec<bool>,

    #[dict]
    kwargs: std::collections::HashMap<String, bool>,
}

依赖关系

~2.9–4.5MB
~81K SLoC