# iri-rs-enum
[](https://crates.io/crates/iri-rs-enum)
[](https://docs.rs/iri-rs-enum)
[](https://crates.io/crates/iri-rs-enum)
[](#license)
`#[derive(IriEnum)]` for IRI-valued enum types, part of the [`iri-rs`](../iri-rs/) workspace. Fork of [`iref-enum`](https://crates.io/crates/iref-enum) by [Timothée Haudebourg](https://github.com/timothee-haudebourg/iref) — reworked to emit `const`-friendly output via `iri-rs-core`'s `from_raw_parts`.
Storing and comparing full IRIs is expensive when you only ever use a known vocabulary. `IriEnum` turns a plain Rust enum into a two-way map between an [`Iri`](../iri-rs-core/) and its variant — `TryFrom<&Iri<T>>` in, `From<&Variant>` to `Iri<&'static str>` out.
```rust
use iri_rs_core::Iri;
use iri_rs_enum::IriEnum;
use iri_rs_static::iri;
#[derive(IriEnum, PartialEq, Debug)]
#[iri_prefix("schema" = "https://schema.org/")]
pub enum Vocab {
#[iri("schema:name")] Name,
#[iri("schema:knows")] Knows,
}
let term = Vocab::try_from(&iri!("https://schema.org/name")).unwrap();
assert_eq!(term, Vocab::Name);
let back: Iri<&'static str> = (&Vocab::Knows).into();
assert_eq!(back.as_str(), "https://schema.org/knows");
```
Prefixes resolve at macro expansion. Each variant's IRI is validated once against the real parser in [`iri-rs-core`](../iri-rs-core/) and emitted as a `const` from pre-computed component positions — no runtime parsing, no allocation.
---
## Install
Enable the `enum` feature on the facade crate (recommended):
```sh
cargo add iri-rs --features enum
```
or depend on this crate directly:
```sh
cargo add iri-rs-core iri-rs-enum iri-rs-static
```
The generated code references `::iri_rs_core::*`, so downstream crates must have `iri-rs-core` as a direct dependency.
## Attributes
| `#[iri_prefix("ns" = "https://...")]` | Enum | Declare a prefix usable in `#[iri(...)]` |
| `#[iri("ns:term")]` | Variant | IRI for this variant (prefixed or absolute) |
Multiple `#[iri_prefix]` attributes may be given on the same enum.
## Fallback variants
A variant with a single unnamed field acts as a catch-all. The inner type must implement `TryFrom<&Iri<T>>` and `From<&Inner>` for `Iri<&'static str>` — both are generated by this derive on nested enums, so fallbacks compose:
```rust,ignore
#[derive(IriEnum, PartialEq, Debug)]
#[iri_prefix("schema" = "https://schema.org/")]
pub enum Person {
#[iri("schema:Person")] Base,
Other(OtherVocab), // fallback: try OtherVocab first
}
```
## Workspace
Part of the [`iri-rs`](https://github.com/mskvarc/iri-rs) workspace. See the [root README](../README.md) for the overall picture, motivation, and fork attribution.
## MSRV
Rust 1.85 (edition 2024).
## License
Dual-licensed:
- [Apache-2.0](../LICENSE-APACHE.md)
- [MIT](../LICENSE-MIT.md)