2 releases
new 0.1.1 | Nov 28, 2024 |
---|---|
0.1.0 | Nov 28, 2024 |
#1194 in Rust patterns
257 downloads per month
20KB
282 lines
const-exhaustive
Enumerate all values of a type at compile time.
Features
-
All values of
T: Exhaustive
are stored in aGenericArray
- allowing you to access all values at compile time, and in a const context. -
Composable with
core
types - supports[T; N]
, tuples up to arity 16,Option<T>
, and other types incore
. -
#[derive(Exhaustive)]
- to implement it on your own types. -
#![no_std]
and noalloc
- you can use it anywhere.
Examples
use const_exhaustive::Exhaustive;
// there is 1 value of `()`
assert_eq!([()], <()>::ALL.as_slice());
// there are 2 values of `bool`
assert_eq!([false, true], bool::ALL.as_slice());
// works on types with generics
assert_eq!(
[None, Some(false), Some(true)],
Option::<bool>::ALL.as_slice()
);
// write your own exhaustive types
#[derive(Debug, Clone, Copy, PartialEq, Exhaustive)]
enum Direction {
North,
South,
East,
West,
}
assert_eq!(
[
Direction::North,
Direction::South,
Direction::East,
Direction::West,
],
Direction::ALL.as_slice()
);
// works on arbitrarily complex types
#[derive(Debug, Clone, Copy, PartialEq, Exhaustive)]
enum Complex {
Direction(Direction),
More {
foo: Option<bool>,
bar: (Result<Direction, [bool; 4]>),
},
}
Testing
Run unit and doc tests:
cargo test
Run miri tests:
cargo +nightly miri test
Test generating docs:
RUSTDOCFLAGS="--cfg docsrs_dep" cargo +nightly doc --workspace --all-features
Dependencies
~0.5–1MB
~23K SLoC