[][src]Derive Macro enum_utils::FromStr

#[derive(FromStr)]
{
    // Attributes available to this derive:
    #[enumeration]
}

Derives FromStr for C-like enums.

The generated code will be more efficient than a simple match statement for most enums. It is guaranteed to run in O(m) time (where m is the length of the input string) rather than the O(mn) time (where n is the number of variants) which would be required by the naive approach.

Examples

FromStr can be derived for C-like enums by deriving enum_utils::FromStr.

#[derive(Debug, PartialEq, enum_utils::FromStr)]
enum Test {
    Alpha,
    Beta,
}

assert_eq!("Alpha".parse(), Ok(Test::Alpha));
assert_eq!("Beta".parse(), Ok(Test::Beta));

Attributes

The implementation can be customized by attributes of the form #[enumeration(...)]. These are based on the ones in serde.

#[enumeration(skip)]

This attribute causes a single variant of the enum to be ignored when deserializing. Variants which are skipped may have data fields.

#[derive(Debug, PartialEq, enum_utils::FromStr)]
enum Skip {
    #[enumeration(skip)]
    Alpha(usize),
    Beta,
}

assert_eq!("Alpha".parse::<Skip>(), Err(()));
assert_eq!("Beta".parse(), Ok(Skip::Beta));

#[enumeration(rename = "...")]

This attribute renames a single variant of an enum. This replaces the name of the variant and overrides rename_all.

Only one rename attribute can appear for each enum variant.

#[derive(Debug, PartialEq, enum_utils::FromStr)]
enum Rename {
    #[enumeration(rename = "α")]
    Alpha,
    Beta,
}

assert_eq!("Alpha".parse::<Rename>(), Err(()));
assert_eq!("α".parse(), Ok(Rename::Alpha));
assert_eq!("Beta".parse(), Ok(Rename::Beta));

#[enumeration(alias = "...")]

This attribute is similar to rename, but it does not replace the name of the variant.

Unlike rename, there is no limit to the number of alias attributes which can be applied. This allows multiple strings to serialize to the same variant.

#[derive(Debug, PartialEq, enum_utils::FromStr)]
enum Alias {
    #[enumeration(alias = "A", alias = "α")]
    Alpha,
    Beta,
}

assert_eq!("Alpha".parse(), Ok(Alias::Alpha));
assert_eq!("A".parse(), Ok(Alias::Alpha));
assert_eq!("α".parse(), Ok(Alias::Alpha));
assert_eq!("Beta".parse(), Ok(Alias::Beta));

#[enumeration(rename_all = "...")]

This attribute can be applied to an entire enum, and causes all fields to be renamed according to the given rename rule. All rename rules defined in serde are supported.

#[enumeration(rename_all = "snake_case")]
#[derive(Debug, PartialEq, enum_utils::FromStr)]
enum RenameAll {
    FooBar,
    BarFoo,
}

assert_eq!("foo_bar".parse(), Ok(RenameAll::FooBar));
assert_eq!("bar_foo".parse(), Ok(RenameAll::BarFoo));

#[enumeration(case_insensitive)]

This attribute can be applied to an entire enum, it causes all variants to be parsed case-insensitively.

#[enumeration(case_insensitive)]
#[derive(Debug, PartialEq, enum_utils::FromStr)]
enum NoCase {
    Alpha,
    Beta,
}

assert_eq!("ALPHA".parse(), Ok(NoCase::Alpha));
assert_eq!("beta".parse(), Ok(NoCase::Beta));