#struct-fields #field-name #type #field #enums #name #struct

field_types

为枚举派生提供一些宏,对应于结构体的字段

4 个稳定版本

使用旧的 Rust 2015

1.1.0 2018 年 11 月 2 日
1.0.3 2018 年 11 月 1 日

#field-name 中排名第 37

Download history 128/week @ 2024-03-13 90/week @ 2024-03-20 97/week @ 2024-03-27 110/week @ 2024-04-03 136/week @ 2024-04-10 232/week @ 2024-04-17 192/week @ 2024-04-24 141/week @ 2024-05-01 184/week @ 2024-05-08 332/week @ 2024-05-15 344/week @ 2024-05-22 409/week @ 2024-05-29 341/week @ 2024-06-05 412/week @ 2024-06-12 282/week @ 2024-06-19 417/week @ 2024-06-26

每月下载量 1,516
用于 11 包(4 个直接使用)

使用 MIT 许可证

17KB
241

字段类型

Crates.io Docs

本库提供了 FieldNameFieldType 派生宏,用于派生 StructFieldNameStructFieldType 枚举,这些枚举对应于任何具有一些字段的 Struct 结构。

..FieldName 枚举包含与结构体字段名称对应的单元类型。此外,您可以使用 name 方法获取字段的静态字符串表示,并使用 by_name 方法通过字符串获取 ..FieldName 变体。

FieldName 使用示例

use field_types::FieldName;

#[derive(FieldName)]
struct Test {
    first: i32,
    second_field: Option<String>,
    #[field_name(skip)]
    third: bool,
}

assert_eq!(TestFieldName::First.name(), "first");
assert_eq!(TestFieldName::SecondField.name(), "second_field");

assert_eq!(Some(TestFieldName::First), TestFieldName::by_name("first"));
assert_eq!(Some(TestFieldName::SecondField), TestFieldName::by_name("second_field"));
assert_eq!(None, TestFieldName::by_name("third"));

let fields = Test::as_field_name_array();
assert_eq!([TestFieldName::First, TestFieldName::SecondField], fields);

..FieldType 枚举包含一些类型,这些类型与结构体字段的名称相对应,并且与结构体字段的值类型相对应。

FieldType 使用示例

use field_types::FieldType;
use variant_count::VariantCount;

#[derive(FieldType)]
#[field_type_derive(VariantCount)]
struct Test {
    first: i32,
    second_field: Option<String>,
    #[field_type(skip)]
    third: bool,
}

let test = Test {
    first: 1,
    second_field: Some("test".to_string()),
    third: true,
};

let fields: [TestFieldType; TestFieldType::VARIANT_COUNT] = test.into();
// or
// let fields = test.into_field_type_array();

assert!(match fields {
    [TestFieldType::First(1), TestFieldType::SecondField(Some(ref s))] if s == "test" => true,
    _ => false,
});

在两种情况下,您都可以跳过带有 #[attr(skip)]#[attr = "skip"] 属性的字段,其中 attrFieldNamefield_namefield_typeFieldType,或任何字段类型的 field_types。您还可以使用 #[attr_derive(..)] 结构属性指定生成枚举的一些派生,其中 attr_derivefield_name_derivefield_type_derivefield_types_derive。例如

#[derive(FieldType, FieldName)]
#[field_types_derive(VariantCount, Debug, Clone, PartialEq)]
struct Test {
    first: i32,
    second: Option<String>,
    #[field_types(skip)]
    third: bool,
    #[field_name = "skip"]
    fourth: bool,
}

默认情况下,FieldName 拥有派生 DebugPartialEqEqCloneCopy。更多用法示例请参阅 tests 目录。

用法

如果您使用 Cargo,只需将其添加到您的 Cargo.toml

[dependencies]
field_types = "*"

许可证

MIT

依赖关系

~2.5MB
~54K SLoC