Serializable map of any type.
This library provides a map that can store any serializable type, and retrieve it as the strong type. Serialization and deserialization is also done without requiring the consumer to implement custom serde logic.
Add the following to Cargo.toml
```toml typereg = { version = "0.3.0", features = ["tagged"] } typereg = { version = "0.3.0", features = ["untagged"] }
type_reg = { version = "0.3.0", features = ["debug"] }
type_reg = { version = "0.3.0", features = ["ordered"] } ```
⚠️ Note: This uses [std::any::type_name
] internally, which is not stable.
```rust use serde::{Deserialize, Serialize}; use type_reg::tagged::TypeMap;
struct A(u32);
fn main() { let mut typemap = TypeMap::new(); typemap.insert("one", 1u32); typemap.insert("two", 2u64); typemap.insert("three", A(3));
println!("{}", serde_yaml::to_string(&type_map).unwrap());
// ---
// one:
// u32: 1
// three:
// "rust_out::A": 3
// two:
// u64: 2
} ```
```rust use serde::{Deserialize, Serialize}; use type_reg::tagged::{TypeMap, TypeReg};
struct A(u32);
fn main() {
let mut typereg = TypeReg::new();
typereg.register::
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)
} ```
```rust use serde::{Deserialize, Serialize}; use type_reg::untagged::TypeMap;
struct A(u32);
fn main() { let mut typemap = TypeMap::new(); typemap.insert("one", 1u32); typemap.insert("two", 2u64); typemap.insert("three", A(3));
println!("{}", serde_yaml::to_string(&type_map).unwrap());
// ---
// two: 2
// one: 1
// three: 3
} ```
```rust use serde::{Deserialize, Serialize}; use type_reg::untagged::{TypeMap, TypeReg};
struct A(u32);
fn main() {
let mut typereg = TypeReg::
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)
} ```
Licensed under either of
at your option.
Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.