#serializable #registry #type #debugging

type_reg

任何类型的可序列化映射

12 个版本 (6 个破坏性更新)

0.7.0 2023年12月29日
0.6.2 2023年9月23日
0.6.0 2023年6月27日
0.5.0 2022年12月26日
0.3.0 2022年2月27日

#244编码

Download history 297/week @ 2024-04-14 88/week @ 2024-04-21 61/week @ 2024-04-28 56/week @ 2024-05-05 36/week @ 2024-05-12 54/week @ 2024-05-19 102/week @ 2024-05-26 101/week @ 2024-06-02 48/week @ 2024-06-09 62/week @ 2024-06-16 56/week @ 2024-06-23 44/week @ 2024-06-30 20/week @ 2024-07-07 84/week @ 2024-07-14 64/week @ 2024-07-21 133/week @ 2024-07-28

每月下载量 327
25 个 crate (3 个直接使用) 中使用

MIT/Apache

155KB
3K SLoC

🗂️ type_reg

Crates.io docs.rs CI Coverage Status

任何类型的可序列化映射。

此库提供了一种可以存储任何可序列化类型并以其强类型检索它的映射。序列化和反序列化也不需要消费者实现自定义 serde 逻辑。

使用方法

将以下内容添加到 Cargo.toml

type_reg = { version = "0.7.0", features = ["tagged"] }
type_reg = { version = "0.7.0", features = ["untagged"] }

# Values must impl Debug, and TypeMap's Debug impl will
# print the debug string of each value.
type_reg = { version = "0.7.0", features = ["debug"] }

# Use insertion order for TypeMap and TypeReg iteration order.
type_reg = { version = "0.7.0", features = ["ordered"] }

未标记类型注册表

序列化

use serde::{Deserialize, Serialize};
use type_reg::untagged::TypeMap;

#[derive(Clone, Copy, Debug, Deserialize, Serialize)]
struct A(u32);

fn main() {
    let mut type_map = TypeMap::new();
    type_map.insert("one", 1u32);
    type_map.insert("two", 2u64);
    type_map.insert("three", A(3));

    println!("{}", serde_yaml::to_string(&type_map).unwrap());

    // ---
    // two: 2
    // one: 1
    // three: 3
}

反序列化

use serde::{Deserialize, Serialize};
use type_reg::untagged::{TypeMap, TypeReg};

#[derive(Clone, Copy, Debug, Deserialize, Serialize)]
struct A(u32);

fn main() {
    let mut type_reg = TypeReg::<String>::new();
    type_reg.register::<u32>(String::from("one"));
    type_reg.register::<u64>(String::from("two"));
    type_reg.register::<A>(String::from("three"));

    let serialized = "---\n\
        one: 1\n\
        two: 2\n\
        three: 3\n\
        ";

    let deserializer = serde_yaml::Deserializer::from_str(serialized);
    let type_map: TypeMap<String> = type_reg.deserialize_map(deserializer).unwrap();

    let data_u32 = type_map.get::<u32, _>("one").copied().unwrap();
    let data_u64 = type_map.get::<u64, _>("two").copied().unwrap();
    let data_a = type_map.get::<A, _>("three").copied().unwrap();

    println!("{data_u32}, {data_u64}, {data_a:?}");

    // 1, 2, A(3)
}

标记类型注册表

⚠️ 注意: 此处内部使用 std::any::type_name,该功能目前不稳定。

序列化

use serde::{Deserialize, Serialize};
use type_reg::tagged::TypeMap;

#[derive(Clone, Copy, Debug, Deserialize, Serialize)]
struct A(u32);

fn main() {
    let mut type_map = TypeMap::new();
    type_map.insert("one", 1u32);
    type_map.insert("two", 2u64);
    type_map.insert("three", A(3));

    println!("{}", serde_yaml::to_string(&type_map).unwrap());

    // ---
    // one:
    //   u32: 1
    // three:
    //   "rust_out::A": 3
    // two:
    //   u64: 2
}

反序列化

use serde::{Deserialize, Serialize};
use type_reg::tagged::{TypeMap, TypeReg};

#[derive(Clone, Copy, Debug, Deserialize, Serialize)]
struct A(u32);

fn main() {
    let mut type_reg = TypeReg::new();
    type_reg.register::<u32>();
    type_reg.register::<u64>();
    type_reg.register::<A>();

    let serialized = "---\n\
        one:   { u32: 1 }\n\
        two:   { u64: 2 }\n\
        three: { 'tagged_deserialize_map::A': 3 }\n\
        ";

    let deserializer = serde_yaml::Deserializer::from_str(serialized);
    let type_map: TypeMap<String> = type_reg.deserialize_map(deserializer).unwrap();

    let data_u32 = type_map.get::<u32, _>("one").copied().unwrap();
    let data_u64 = type_map.get::<u64, _>("two").copied().unwrap();
    let data_a = type_map.get::<A, _>("three").copied().unwrap();

    println!("{data_u32}, {data_u64}, {data_a:?}");

    // 1, 2, A(3)
}

许可证

根据您的选择,许可如下

贡献

除非您明确声明,否则您有意提交的任何贡献,根据 Apache-2.0 许可证定义,将按照上述方式双重许可,而无需任何额外的条款或条件。

依赖关系

~0.8–1.9MB
~40K SLoC