field_names
field_names
is a Rust crate to expose a field or variant names from source code as strings at runtime.
Example
Consider a simple struct such as this one.
field_names
will emit the following:
Enums are the same:
field_names
will emit the following:
Uses
This crate was originally created for a case where a set of rules were being read at runtime which referenced fields of structs elsewhere in the code base.
The referenced struct exposed a method which had a match
statement to go from strings to its fields, but there was not a way to ensure the arms of that match statement stayed in sync with the struct definition.
With this crate, a unit test could be created to ensure that every field on the struct - except those deliberately omitted - was handled by the method.
This crate can also be used to enforce relationships among structs and enums at unit-test time that cannot be expressed at compile-time.
See tests/keep_in_sync
for an example and explanation of that scenario.
FAQs
Why aren't FieldNames
and VariantNames
traits?
Using field_names
is an implementation convenience; it shouldn't force you to change your crate's public API.
How do I make FIELDS
or VARIANTS
public?
You can add your own inherent method, e.g. fields() -> &[&'static str]
, or define a trait that matches your use-case and reference FIELDS
in the trait implementation.
Can I get field names for an enum variant?
This currently isn't supported, using newtype variants and separate structs per variant is currently the recommended approach.
You can use the from_variants
crate to auto-generate conversions from those structs into the enum.