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- [EnumNames] — Variant names.
14
15Unfortunately, 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.
16
17# Example
18```rust
19use cenum_utils::*;
20
21#[derive(ConstEnum)]
22#[repr(u8)]
23enum Enum {
24	X,
25	Y,
26	Z
27}
28
29fn test() {
30	assert_eq!(Enum::COUNT, 3);
31	assert_eq!(Enum::DISCRIMINANTS, &[0, 1, 2]);
32	assert_eq!(Enum::NAMES, &["X", "Y", "Z"])
33}
34
35const fn const_test() {
36	assert!(Enum::COUNT == 3);
37
38	static NAMES: &[u8] = &[b'X', b'Y', b'Z'];
39
40	let mut i = 0;
41
42	while i < Enum::COUNT {
43		assert!(Enum::DISCRIMINANTS[i] as usize == i);
44		assert!(Enum::NAMES[i].as_bytes()[0] == NAMES[i]);
45		i += 1;
46	}
47}
48
49# test();
50# const_test();
51```
52
53# Features
54
55- **`derive`** *(enabled by default)* — Derive macros for the core traits provided by this crate.
56*/
57
58#![cfg_attr(docsrs, feature(doc_cfg))]
59
60#[cfg(feature = "derive")]
61#[cfg_attr(docsrs, doc(cfg(feature = "derive")))]
62pub use cenum_utils_derive::ConstEnum;
63
64/// A trait providing access to the number of enum variants a type contains.
65pub trait EnumCount {
66	/// The number of enum variants this type contains.
67	const COUNT: usize;
68}
69
70/// A trait providing access to the discriminants of an enum's variants.
71pub trait EnumDiscriminants {
72	type Discriminant: 'static;
73
74	/// A reference to an array containing the discriminants for all enum variants this type contains.
75	const DISCRIMINANTS: &[Self::Discriminant];
76
77	/// Returns an iterator over the discriminants for all enum variants this type contains.
78	fn discriminants() -> impl Iterator<Item = &'static Self::Discriminant> {
79		Self::DISCRIMINANTS.iter()
80	}
81}
82
83/// A trait providing access to the names of an enum's variants.
84pub trait EnumNames {
85	/// A reference to an array containing the names for all enum variants this type contains.
86	const NAMES: &[&str];
87
88	/// Returns an iterator over the names for all enum variants this type contains.
89	fn names() -> impl Iterator<Item = &'static str> {
90		Self::NAMES.iter().copied()
91	}
92}