1 个不稳定版本

0.2.0 2022年5月20日

#474 in #generic


rustructure 中使用

BSD-4-Clause

6KB
99

rustructure 支持在运行时遍历指定的Rust类型。

这允许从消费外部类型的库的角度进行一定程度的内省。一个激励示例是在需要一个类型实例时,生成序列化或反序列化代码作为 serde 的补充,此时格式需要预先了解类型。

此crate可以通过移除默认的 std 功能变为 no_std,但如果没有至少 alloc,其实用性可能有限,直到 泛型关联类型 进入稳定版本。

此库的主要功能是 Walkable trait/derive 宏和 Walker trait。一个简单的 Walker 示例,它生成类似于S-expression的数据类型的表示,作为 StringWalker 包含在内(在 no_std 中不可用)

use rustructure::Walkable;

#[derive(Walkable)]
struct ExampleStruct<'l> {
    a: Option<u8>,
    b: &'l str,
    c: (u64, String)
}

assert_eq!(
    rustructure::StringWalker::walk::<ExampleStruct>(),
    "(struct:ExampleStruct \
        (field:a (option integer)) \
        (field:b str) \
        (field:c (tuple \
            (field:0 integer) \
            (field:1 str)\
            )\
        )\
    )".to_string()
);

如果感兴趣,可以在未发布的 rustructure-test crate 中找到库的测试用例(通过 StringWalker),在源代码仓库

依赖项

~1.5MB
~36K SLoC