enum-helper 0.1.0

Yet another enum helper. Macros that generate common boilerplate for enums.
Documentation
use assert2::check;
use enum_helper::EnumStr;

#[derive(EnumStr, PartialEq, Eq)]
#[enum_str(rename_all = "snake_case")]
#[enum_str(alias_all = "lowercase")]
enum RenameAliasAll {
    FooBar,
    Baz,
}

#[test]
fn rename_all_alias_all_as_aliases() {
    check!(RenameAliasAll::FooBar.as_aliases() == &["foo_bar", "foobar"]);
    check!(RenameAliasAll::Baz.as_aliases() == &["baz"]);
}

#[test]
fn rename_all_alias_all_from_str() {
    check!("foo_bar".parse::<RenameAliasAll>().unwrap() == RenameAliasAll::FooBar);
    check!("foobar".parse::<RenameAliasAll>().unwrap() == RenameAliasAll::FooBar);
    check!("baz".parse::<RenameAliasAll>().unwrap() == RenameAliasAll::Baz);
}

#[derive(EnumStr, PartialEq, Eq)]
#[enum_str(rename_all = "lowercase")]
enum RenameOverride {
    #[enum_str(rename = "CustomName")]
    FooBar,
    Baz,
}

#[test]
fn rename_override_as_name() {
    check!(RenameOverride::FooBar.as_name() == "CustomName");
    check!(RenameOverride::Baz.as_name() == "baz");
}

#[test]
fn rename_override_from_str() {
    check!("CustomName".parse::<RenameOverride>().unwrap() == RenameOverride::FooBar);
    check!("baz".parse::<RenameOverride>().unwrap() == RenameOverride::Baz);
    check!("FooBar".parse::<RenameOverride>().is_err());
    check!("foobar".parse::<RenameOverride>().is_err());
}

#[derive(EnumStr, PartialEq, Eq)]
enum WithAlias {
    #[enum_str(alias = "foo")]
    #[enum_str(alias = "f")]
    FooBar,
    Baz,
}

#[test]
fn alias_as_aliases() {
    check!(WithAlias::FooBar.as_aliases() == &["FooBar", "foo", "f"]);
    check!(WithAlias::Baz.as_aliases() == &["Baz"]);
}

#[test]
fn alias_from_str() {
    check!("FooBar".parse::<WithAlias>().unwrap() == WithAlias::FooBar);
    check!("foo".parse::<WithAlias>().unwrap() == WithAlias::FooBar);
    check!("f".parse::<WithAlias>().unwrap() == WithAlias::FooBar);
    check!("Baz".parse::<WithAlias>().unwrap() == WithAlias::Baz);
    check!("baz".parse::<WithAlias>().is_err());
}

#[derive(EnumStr, PartialEq, Eq)]
#[enum_str(alias_all = "lowercase")]
enum DedupAlias {
    Foo,
    Baz,
}

#[test]
fn dedup_alias_as_aliases() {
    // "Foo" name stays, "foo" from alias_all is added (different from name)
    check!(DedupAlias::Foo.as_aliases() == &["Foo", "foo"]);
    check!(DedupAlias::Baz.as_aliases() == &["Baz", "baz"]);
}

#[derive(EnumStr, PartialEq, Eq)]
#[enum_str(rename_all = "snake_case")]
#[enum_str(alias_all = "lowercase")]
enum FullCombo {
    #[enum_str(rename = "overridden")]
    #[enum_str(alias = "extra")]
    #[enum_str(alias = "foobar")]
    FooBar,
    BazQux,
}

#[test]
fn full_combo_as_aliases() {
    check!(FullCombo::FooBar.as_aliases() == &["overridden", "foobar", "extra"]);
    check!(FullCombo::BazQux.as_aliases() == &["baz_qux", "bazqux"]);
}

#[test]
fn full_combo_from_str() {
    check!("overridden".parse::<FullCombo>().unwrap() == FullCombo::FooBar);
    check!("foobar".parse::<FullCombo>().unwrap() == FullCombo::FooBar);
    check!("extra".parse::<FullCombo>().unwrap() == FullCombo::FooBar);
    check!("baz_qux".parse::<FullCombo>().unwrap() == FullCombo::BazQux);
    check!("bazqux".parse::<FullCombo>().unwrap() == FullCombo::BazQux);
    check!("foo_bar".parse::<FullCombo>().is_err());
}