struct_field_names

Crates.iostruct_field_names
lib.rsstruct_field_names
version0.2.1
sourcesrc
created_at2021-06-08 08:23:29.216718
updated_at2021-07-05 16:14:26.481153
descriptionDerive macros for generating the name of each field in a struct and each variant name in an enum as `&'static str`
homepage
repositoryhttps://github.com/wishawa/struct_field_names
max_upload_size
id407669
size10,630
Wisha W. (wishawa)

documentation

https://docs.rs/struct_field_names

README

struct_field_names

crates.io

Provides StructFieldNames derive macro.

#[derive(StructFieldNames)]
struct SomeStruct {
    field_one: i32,
    field_two: Vec<bool>,
}

generates

struct SomeStructFieldStaticStr {
    field_one: &'static str,
    field_two: &'static str,
}
impl SomeStruct {
    const FIELD_NAMES: SomeStructFieldStaticStr = SomeStructFieldStaticStr {
        field_one: "field_one",
        field_two: "field_two",
    };
}

which can be used like

let field_one_name: &'static str = SomeStruct::FIELD_NAMES.field_one;
println!("{}", field_one_name);

.

This is useful mostly for typo-proofing.

Credits to the field_types crate. A lot of code here is copied from there.

Usage

Use the StructFieldNames derive macro like this:

#[derive(StructFieldNames)]
struct SomeStruct {
    field_one: i32,
    field_two: Vec<bool>,
}

then access the field name as &'static str like this:

let field_one_name: &'static str = SomeStruct::FIELD_NAMES.field_one;

Use #[struct_field_names(skip)] to skip fields. With

#[derive(StructFieldNames)]
struct Struct {
	field_one: bool,
	#[struct_field_names(skip)]
	field_two: usize,
}

SomeStruct::FIELD_NAMES.field_two won't exist.

Visibility of the field names struct follows your struct.

With

#[derive(StructFieldNames)]
pub struct PublicStruct {
	pub public_field: i32,
	private_field: i32
}
#[derive(StructFieldNames)]
struct PrivateStruct {
	pub public_field: i32,
	private_field: i32
}

only PublicStruct::FIELD_NAMES.public_field would be available to the outside world.

Commit count: 4

cargo fmt