plural-derive 0.1.0

This crate contains the derive macro `Plural` we use with the `PluralDisplay` trait
Documentation
# `plural-derive`

`plural-derive` is a procedural macro crate for Rust that simplifies generating plural forms for enum variants. With this crate, you can derive the `PluralDisplay` trait for enums, enabling a method to retrieve the pluralized version of each variant.

## Features

- **Customizable Pluralization**: Use the `#[plural("...")]` attribute to specify custom plural forms for enum variants.
- **Default Pluralization**: Automatically generates default plural forms by converting CamelCase variants to lowercase words and appending "s".
- **Handles Special Cases**: Supports special characters, spaces, and irregular pluralization rules.
- **Type Safety**: Provides compile-time enforcement for pluralization logic, ensuring correctness.
- **Support for Empty Enums**: Generates safe, uninhabited code for empty enums.

## Example Usage

### Add Dependencies

Add `plural-derive` and `plural-trait` to your `Cargo.toml`:

```toml
[dependencies]
plural-derive = "0.1.0"
plural-trait = "0.1.0"
```

### Define an Enum

```rust
use plural_derive::Plural;
use plural_trait::PluralDisplay;

#[derive(Plural, Debug)]
pub enum PoeticForms {
    #[plural("alcaic stanzas")]
    AlcaicStanza,
    #[plural("ballads")]
    Ballad,
    #[plural("burns stanzas")]
    BurnsStanza,
    BlankVerse, // Default: "blank verses"
    Couplet,    // Default: "couplets"
    Haiku,      // Default: "haikus"
}

fn main() {
    let form = PoeticForms::Haiku;
    println!("Plural: {}", form.plural()); // Output: "Plural: haikus"
}
```

### Custom Pluralization

You can specify irregular or custom plural forms using the `#[plural("...")]` attribute:

```rust
#[derive(Plural, Debug)]
pub enum CustomEnum {
    #[plural("special cases")]
    SpecialCase,
    #[plural("irregular")]
    IrregularForm,
}
```

### Empty Enum Handling

Enums with no variants are supported safely:

```rust
#[derive(Plural, Debug)]
pub enum EmptyEnum {}
```

Attempting to use an instance of `EmptyEnum` will result in a compile-time error.

### Test Output

The `PluralDisplay` trait provides the `plural()` method to retrieve the pluralized form of an enum variant:

```rust
use PoeticForms::*;

assert_eq!(AlcaicStanza.plural(), "alcaic stanzas");
assert_eq!(BlankVerse.plural(), "blank verses");
assert_eq!(Couplet.plural(), "couplets");
```

## Testing

Run the included test suite to verify functionality:

```sh
cargo test
```

## How It Works

1. **Custom Attribute Parsing**: The `#[plural("...")]` attribute allows specifying custom plural forms.
2. **Default Pluralization Logic**: For variants without a `#[plural(...)]` attribute, the macro converts CamelCase to lowercase words and appends "s".
3. **Trait Implementation**: The procedural macro generates an implementation of the `PluralDisplay` trait, which provides the `plural()` method.

## Limitations

- Only supports enums. Attempting to derive `Plural` for structs or other data types will result in a compile-time error.
- Default pluralization is basic and may not handle all linguistic nuances.

## Contributing

Contributions are welcome! If you encounter bugs, have suggestions, or want to extend the functionality, feel free to open an issue or submit a pull request.

1. Fork the repository.
2. Create your feature branch: `git checkout -b feature-name`.
3. Commit your changes: `git commit -m 'Add feature'`.
4. Push to the branch: `git push origin feature-name`.
5. Open a pull request.

## License

This project is licensed under the MIT License. See the [LICENSE](./LICENSE) file for details.

## Acknowledgments

Special thanks to the Rust community for their resources and guidance in building procedural macros.