# `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.