# Enum Variants Strings

[![Crates.io badge](https://img.shields.io/crates/v/enum-variants-strings)](https://crates.io/crates/enum-variants-strings)
[![Docs.rs badge](https://docs.rs/enum-variants-strings/badge.svg)](https://docs.rs/enum-variants-strings/)

Generates conversions of enums from strings and into strings based on variant identifiers

```rust
use enum_variants_strings::EnumVariantsStrings;

#[derive(Debug, PartialEq, EnumVariantsStrings)]
enum Variants {
    X,
    Y(i32),
    #[enum_variants_strings_mappings("z", "zee")]
    Z {
        x: String,
        y: String,
    },
}

fn main() {
    assert_eq!(Variants::from_str("x"), Ok(Variants::X));
    assert_eq!(Variants::from_str("y"), Ok(Variants::Y(0)));
    assert_eq!(
        Variants::from_str("z"),
        Ok(Variants::Z {
            x: String::default(),
            y: String::default(),
        })
    );

    assert_eq!(Variants::X.to_str(), "x");
    assert_eq!(
        Variants::Z {
            x: "abc".into(),
            y: "xyz".into()
        }
        .to_str(),
        "zee"
    );
}
```

## Identifier mapping

**By default variant identifier/names are transformed to their snake case version**

This can be changed via `#[enum_variants_strings_transform(transform = ...)]`

```rust
use enum_variants_strings::EnumVariantsStrings;

#[derive(Debug, PartialEq, EnumVariantsStrings)]
#[enum_variants_strings_transform(transform = "none")]
enum EnumA {
    Foo,
    Bar,
}
```

There are several transforms

- `"snake_case"`, separate uppercase and numeric boundaries with `_` (default)
- `"kebab_case"`, snake case with `-` instead of underscores
- `"upper_case"`, uppercase of identifier in source
- `"lower_case"`, lowercase of identifier in source
- `"none"`, no mapping from the identifier in the source
