#data-model #error #save #tree #complete #variant #information

serde-save

为serde提供最完整的数据序列化树

2个版本

0.1.1 2024年4月24日
0.1.0 2024年4月23日

#583 in 编码

Download history 265/week @ 2024-04-21 19/week @ 2024-04-28 1/week @ 2024-05-05 1/week @ 2024-05-19

每月59次下载

MIT/Apache

50KB
1K SLoC

serde提供最完整的数据序列化树。

Save代表整个serde数据模型,包括结构体名称字段名称枚举变体信息。这意味着它可以在结构体序列化之前拦截它们,并在无损转发它们。

Save可以选择在序列化树中持久化错误,而不是中断。这是一个零成本的选项 - 有关更多信息,请参阅Save::Error上的文档。

#[derive(Serialize)]
struct MyStruct {
    system_time: SystemTime,
    path_buf: PathBuf,
    normal_string: String,
}

// These will fail to serialize
let before_unix_epoch = SystemTime::UNIX_EPOCH - Duration::from_secs(1);
let non_utf8_path = PathBuf::from(OsString::from_vec(vec![u8::MAX]));

let my_struct = MyStruct {
    system_time: before_unix_epoch,
    path_buf: non_utf8_path,
    normal_string: String::from("this is a string"), // this is fine
};

// By default errors are short-circuiting
assert_eq!(
    save(&my_struct).unwrap_err().to_string(),
    "SystemTime must be later than UNIX_EPOCH"
);

// But you can persist and inspect them in-tree if you prefer.
assert_eq!(
    save_errors(&my_struct), // use this method instead
    Save::strukt(
        "MyStruct",
        [
            ("system_time",   Save::error("SystemTime must be later than UNIX_EPOCH")),
            ("path_buf",      Save::error("path contains invalid UTF-8 characters")),
            ("normal_string", Save::string("this is a string")),
        ]
    )
)

Serializer还可以检查serde协议的实现是否正确。

有关Save变体的文档,请查看已检查的哪些不变量。您可以配置此行为

依赖项

~110–350KB