7 个版本
0.1.6 | 2022 年 10 月 16 日 |
---|---|
0.1.5 | 2021 年 5 月 24 日 |
0.1.4 | 2021 年 4 月 24 日 |
0.1.3 | 2021 年 1 月 7 日 |
0.1.0 | 2020 年 9 月 1 日 |
在 Rust 模式 中排名第 1309
每月下载量 210
11KB
103 行代码(不含注释)
structmap
用于在 Rust 结构体类型和关联容器之间进行转换的过程宏包。
use std::collections::BTreeMap;
// converting between a struct like ...
struct SomeData {
key: String
}
// ... and a BTreeMap like ...
let somedata_hm: BTreeMap<String, String> = BTreeMap::new();
这消除了在转换时进行属性和键的模式匹配的需要。
它主要受到了 之前的作品 启发,但在此基础上扩展了更远,以支持双向转换、泛型值类型和 Rust 2018 规范。
使用方法
在你的 Cargo.toml
文件中,包含如下包
[dependencies]
structmap = "0.1"
现在让我们演示转换!请注意,你的 struct
类型应该扩展 Default
特性,以便在转换时考虑未初始化的属性。
structmap 支持两种类型的映射别名之间的转换
StringMap
- 键和值都是字符串。目前仅支持从结构体到 BTreeMap 的单向转换,但不是相反方向。GenericMap
- 以 serde-风格的Value
作为值。支持双向转换,但有限。
从映射到结构体
use structmap::FromMap;
use structmap_derive::FromMap;
#[derive(FromMap)]
struct TestStruct {
name: String,
value: i64,
}
impl Default for TestStruct {
fn default() -> Self {
Self {
name: String::new(),
value: 0
}
}
}
fn main() {
// create a hashmap with key-value pairs
let mut hm = GenericMap::new();
// `Value` is an enum wrapper to support genericized types, to support structs
// with varying types for their fields.
hm.insert(String::from("name"), Value::new(String::from("example")));
hm.insert(String::from("value"), Value::new(0_i64));
// convert hashmap to struct, and check attributes
let test: TestStruct = TestStruct::from_genericmap(hm);
assert!(test.name == "example");
assert!(test.value == 0);
}
从结构体到映射
use structmap::{ToMap, value::Value};
use structmap_derive::ToMap;
use std::collections::BTreeMap;
#[derive(ToMap, Default)]
struct TestStruct {
name: String,
value: i64,
}
// impl Default ...
fn main() {
let test_struct = TestStruct {
name: String::from("example"),
value: 0,
};
// convert struct to generic map, and check attributes
let hm: BTreeMap<String, Value> = TestStruct::to_genericmap(test_struct);
assert!(hm.get("name").unwrap().String().unwrap() == "example");
assert!(hm.get("value").unwrap().i64().unwrap() == 0);
let test_struct = TestStruct {
name: String::from("example"),
value: 0,
};
// convert struct to string map, and check attributes
let hm: BTreeMap<String, String> = TestStruct::to_stringmap(test_struct);
assert!(hm.get("name").unwrap() == "example");
assert!(hm.get("value").unwrap() == "0");
}
在将结构体转换为映射容器时需要不同的键名?使用 #[rename]
为结构体属性命名!
use structmap::ToMap;
use structmap_derive::ToMap;
#[derive(ToMap, Default)]
struct TestStruct {
#[rename(name = "Full Name")]
name: String,
#[rename(name = "Data")]
value: String,
}
贡献
所有复杂类型,包括动态数组、Option
、Result
和数据结构尚不支持(你可以帮助实现!)。
如果你认为还有需要实现的功能,请随时告诉我!
感谢以下贡献者
许可证
依赖
~1.5MB
~34K SLoC