#枚举 #miniserde

miniserde-enum

为枚举提供miniserde的派生宏

4个版本

0.1.3 2019年11月19日
0.1.2 2019年11月18日
0.1.1 2019年11月18日
0.1.0 2019年11月18日

#638 in 进程宏

MIT/Apache

41KB
927 代码行

miniserde-enum

Build

此crate公开了为miniserde的SerializeDeserialize特质在枚举上提供的派生宏。

此crate的目标是提供类似于Serde对miniserde的枚举支持(见Serde的枚举表示列表)。

示例

外部标记枚举的反序列化

use miniserde::{Deserialize, json};
use miniserde_enum::Deserialize_enum;

#[derive(Deserialize_enum, Debug, PartialEq)]
enum External {
    A(i32),
    #[serde(rename = "renamedB")]
    B(i32, String),
    C {
        x: i32,
    },
    D,
}
use External::*;

let example = r#"[{"A":21},{"renamedB":[42,"everything"]},{"C":{"x":2}},"D"]"#;
let actual: Vec<External> = json::from_str(example).unwrap();
let expected = [A(21), B(42, "everything".to_string()), C { x: 2 }, D];
assert_eq!(actual, expected);

内部标记枚举的序列化

use miniserde::{json, Serialize};
use miniserde_enum::Serialize_enum;

#[serde(tag = "type")]
#[derive(Serialize_enum)]
enum Internal {
    A,
    #[serde(rename = "renamedB")]
    B,
    C {
        x: i32,
    },
}
use Internal::*;

let example = [A, B, C { x: 2 }];
let actual = json::to_string(&example[..]);
let expected = r#"[{"type":"A"},{"type":"renamedB"},{"type":"C","x":2}]"#;
assert_eq!(actual, expected);

更多示例可以在测试目录中找到。

限制

内部标记枚举和相邻标记枚举的反序列化需要标记是对象的第一个键,否则from_str将返回错误。

此外,并非所有枚举表示目前都受到支持(见TODO)。

TODO

  • 序列化
    • 外部标记枚举
    • 内部标记枚举
    • 无标记枚举
    • 相邻标记枚举
  • 反序列化
    • 外部标记枚举
    • 内部标记枚举
    • 无标记枚举
    • 相邻标记枚举

许可证

根据您的选择,许可在Apache许可证,版本2.0MIT许可证下。
除非您明确声明,否则根据Apache-2.0许可证定义,您有意提交给Serde的贡献,将按上述方式双重许可,没有任何附加条款或条件。

依赖关系

~0.4–1MB
~21K SLoC