cenum_utils/
lib.rs

1/*!
2[![github]](https://github.com/Josh194/ConstEnumUtils) [![crates-io]](https://crates.io/crates/cenum-utils) [![docs-rs]](https://docs.rs/cenum-utils)
3
4[github]: https://img.shields.io/badge/github-8da0cb?style=for-the-badge&labelColor=555555&logo=github
5[crates-io]: https://img.shields.io/badge/crates.io-fc8d62?style=for-the-badge&labelColor=555555&logo=rust
6[docs-rs]: https://img.shields.io/badge/docs.rs-66c2a5?style=for-the-badge&labelColor=555555&logo=docs.rs
7
8`cenum_utils` provides a minimal set of traits and (optionally) derive macros providing const access to certain enum properties.
9
10Currently this includes:
11- [EnumCount] — Variant counts.
12- [EnumDiscriminants] — Variant discriminants.
13
14Unfortunately, due to rust's currently lack of const trait support, actually interacting with some of the features this crate provides in const contexts can be somewhat difficult.
15
16# Example
17```rust
18use cenum_utils::{ConstEnum, EnumCount as _, EnumDiscriminants as _};
19
20#[derive(ConstEnum)]
21#[repr(u8)]
22enum Enum {
23	X,
24	Y,
25	Z
26}
27
28const fn test() {
29	assert!(Enum::COUNT == 3);
30
31	let mut i = 0;
32
33	while i < Enum::DISCRIMINANTS.len() {
34		assert!(Enum::DISCRIMINANTS[i] as usize == i);
35		i += 1;
36	}
37}
38```
39
40# Features
41
42- **`derive`** *(enabled by default)* — Derive macros for the core traits provided by this crate.
43*/
44
45#![cfg_attr(docsrs, feature(doc_cfg))]
46
47#[cfg(feature = "derive")]
48#[cfg_attr(docsrs, doc(cfg(feature = "derive")))]
49pub use cenum_utils_derive::ConstEnum;
50
51/// A trait providing access to the number of enum variants a type contains.
52pub trait EnumCount {
53	/// The number of enum variants this type contains.
54	const COUNT: usize;
55}
56
57/// A trait providing access to the discriminants of an enum's variants.
58pub trait EnumDiscriminants {
59	type Discriminant: 'static;
60
61	/// A reference to an array containing the discriminants for all enum variants this type contains.
62	const DISCRIMINANTS: &[Self::Discriminant];
63
64	/// Returns an iterator over the discriminants for all enum variants this type contains.
65	fn discriminants() -> impl Iterator<Item = &'static Self::Discriminant> {
66		Self::DISCRIMINANTS.iter()
67	}
68}