Crates.io | runtime-struct-field-names-as-array |
lib.rs | runtime-struct-field-names-as-array |
version | 0.1.0 |
source | src |
created_at | 2023-03-21 14:51:11.309195 |
updated_at | 2023-03-21 14:51:11.309195 |
description | Provides a procedural macro that generates an array of the field names of a named struct |
homepage | https://github.com/0cv/runtime_struct_field_names_as_array |
repository | https://github.com/0cv/runtime_struct_field_names_as_array |
max_upload_size | |
id | 816249 |
size | 9,018 |
Provides the FieldNamesAsArray
procedural macro.
The macro adds the fn field_names_as_array()
to the struct the macro is derived on. It contains the field names of the given
struct, including the parents
Note: The macro can only be derived from named structs.
IMPORTANT This crate has a runtime overhead while it has limited options. If you do NOT intend to use it on a nested struct, you shall use this crate instead. See discussion
You can derive the FieldNamesAsArray
macro like this:
use runtime_struct_field_names_as_array::FieldNamesAsArray;
#[derive(FieldNamesAsArray)]
struct Foo {
bar: String,
baz: String,
bat: String,
}
assert_eq!(Foo::field_names_as_array(), ["bar", "baz", "bat"]);
The FieldNamesAsArray
macro supports the
field_names_as_array
attribute.
field_names_as_array
can be applied to a field with only the flatten
attribute
Container attributes are global attributes that change the behavior of the whole field names array, rather than that of a single field.
Field attributes can be added to the fields of a named struct and change the behavior of a single field.
The flatten
attribute will add the parent fields. Option struct are also supported. If the attribute is not added on a struct type, it will be considered as a regular field.
use runtime_struct_field_names_as_array::FieldNamesAsArray;
#[derive(FieldNamesAsArray)]
struct Parent {
foo: String,
}
#[derive(FieldNamesAsArray)]
struct Foo {
bar: String,
baz: String,
#[field_names_as_array(flatten)]
parent: Parent,
#[field_names_as_array(flatten)]
parent_option: Option<Parent>,
another_parent: Parent,
}
assert_eq!(Foo::field_names_as_array(), ["bar", "baz", "parent.foo", "parent_option.foo", "another_parent"]);