#proc-macro #struct #btree-map #container #conversion #associative #converting

structmap

用于在 Rust 结构体和关联容器之间进行转换的过程宏库

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

Download history 23/week @ 2024-03-12 27/week @ 2024-03-19 49/week @ 2024-03-26 11/week @ 2024-04-02 1/week @ 2024-04-09 23/week @ 2024-04-23 7/week @ 2024-04-30 43/week @ 2024-05-07 23/week @ 2024-05-14 44/week @ 2024-05-21 50/week @ 2024-05-28 49/week @ 2024-06-04 40/week @ 2024-06-11 63/week @ 2024-06-18 50/week @ 2024-06-25

每月下载量 210

MIT 许可证

11KB
103 行代码(不含注释)

structmap

Actions crates.io version Docs

用于在 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 支持两种类型的映射别名之间的转换

  1. StringMap - 键和值都是字符串。目前仅支持从结构体到 BTreeMap 的单向转换,但不是相反方向。
  2. 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,
}

贡献

所有复杂类型,包括动态数组、OptionResult 和数据结构尚不支持(你可以帮助实现!)。

如果你认为还有需要实现的功能,请随时告诉我!

感谢以下贡献者

许可证

MIT 许可证

依赖

~1.5MB
~34K SLoC