-
Notifications
You must be signed in to change notification settings - Fork 151
Additional Attributes
Strum supports several custom attributes to modify the generated code. At the enum level, the
#[strum(serialize_all = "snake_case")]
attribute can be used to change the case used when
serializing to and deserializing from strings:
extern crate strum;
#[macro_use]
extern crate strum_macros;
#[derive(Debug, Eq, PartialEq, ToString)]
#[strum(serialize_all = "snake_case")]
enum Brightness {
DarkBlack,
Dim {
glow: usize,
},
#[strum(serialize = "bright")]
BrightWhite,
}
fn main() {
assert_eq!(
String::from("dark_black"),
Brightness::DarkBlack.to_string().as_ref()
);
assert_eq!(
String::from("dim"),
Brightness::Dim { glow: 0 }.to_string().as_ref()
);
assert_eq!(
String::from("bright"),
Brightness::BrightWhite.to_string().as_ref()
);
}
Custom attributes are applied to a variant by adding #[strum(parameter="value")]
to the variant.
-
serialize="..."
: Changes the text thatFromStr()
looks for when parsing a string. This attribute can be applied multiple times to an element and the enum variant will be parsed if any of them match. -
to_string="..."
: Similar toserialize
. This value will be included when usingFromStr()
. More importantly, this specifies what text to use when callingvariant.to_string()
with theToString
derivation, or when callingvariant.as_ref()
withAsRefStr
. -
default
: Applied to a single variant of an enum. The variant must be a Tuple-like variant with a single piece of data that can be create from a&str
i.e.T: From<&str>
. The generated code will now return the variant with the input string captured as shown below instead of failing.// Replaces this: _ => Err(strum::ParseError::VariantNotFound) // With this in generated code: default => Ok(Variant(default.into()))
The plugin will fail if the data doesn't implement From<&str>. You can only have one
default
on your enum. -
disabled
: removes variant from generated code. -
message=".."
: Adds a message to enum variant. This is used in conjunction with theEnumMessage
trait to associate a message with a variant. Ifdetailed_message
is not provided, thenmessage
will also be returned when get_detailed_message() is called. -
detailed_message=".."
: Adds a more detailed message to a variant. If this value is omitted, thenmessage
will be used in it's place. -
props(key="value")
: Enables associating additional information with a given variant.