https://github.com/deotimedev/checks
Adds several compile-time checks for rust const generics.
https://github.com/deotimedev/checks
const-generics no-std rust rust-macro
Last synced: 20 days ago
JSON representation
Adds several compile-time checks for rust const generics.
- Host: GitHub
- URL: https://github.com/deotimedev/checks
- Owner: deotimedev
- Created: 2023-04-20T15:26:30.000Z (about 3 years ago)
- Default Branch: master
- Last Pushed: 2023-05-17T17:55:05.000Z (about 3 years ago)
- Last Synced: 2025-12-14T01:09:10.225Z (6 months ago)
- Topics: const-generics, no-std, rust, rust-macro
- Language: Rust
- Homepage: https://crates.io/crates/checks
- Size: 21.5 KB
- Stars: 1
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# checks
Adds several compile time checks for const generics.
Idea was based off of [this reddit post](https://www.reddit.com/r/rust/comments/gt067a/implementing_a_trait_only_for_types_satisfying_a/).
#### Note: This library requires use of the `#![feature(generic_const_exprs)]` flag.
## Usage:
```rust
#![feature(generic_const_exprs)]
/// Only allows for arguments of `C` to be alphabetic
struct AlphabeticTest
where
checks::char::Alphabetic: checks::Passed;
// All letters are alphabetic, check passes.
let pass = AlphabeticTest::<'a'>; // Compiles
let pass = AlphabeticTest::<'B'>; // Compiles
let pass = AlphabeticTest::<'c'>; // Compiles
// Letters are not alphabetic, check fails.
let fail = AlphabeticTest::<'1'>; // Compile error!
let fail = AlphabeticTest::<'&'>; // Compile error!
let fail = AlphabeticTest::<'3'>; // Compile error!
```
Custom checks can be implemented as well:
```rust
const fn is_binary(num: u8) -> bool { num == 0 || num == 1 }
struct BinaryOnly
where
Check<{ is_binary(N) }>: Passed;
let pass = BinaryOnly::<0>; // Compiles
let pass = BinaryOnly::<1>; // Compiles
let fail = BinaryOnly::<2>; // Compiler error!
```
Checks can also be defined with the `check!` macro, which will
also generate documentation / tests for example input:
```rust
check! { u8 =>
/// Matches all binary numbers (0, 1)
Binary(
passes: 0, 1
fails: 2, 3, 4
): |N| (N == 0 || N == 1)
}
struct BinaryOnly
where
Binary: Passed;
let pass = BinaryOnly::<0>; // Compiles
let pass = BinaryOnly::<1>; // Compiles
let fail = BinaryOnly::<2>; // Compiler error!
```
Full list of provided checks can be found on the [docs.rs page](https://docs.rs/checks/latest).