checks

Crates.iochecks
lib.rschecks
version1.0.6
sourcesrc
created_at2023-04-20 15:30:03.863166
updated_at2023-05-17 17:55:08.307245
descriptionAdds several compile time checks for const generics
homepage
repositoryhttps://github.com/DeoTimeTheGithubUser/checks
max_upload_size
id844555
size9,556
deotime (deotimedev)

documentation

README

checks

Adds several compile time checks for const generics.

Idea was based off of this reddit post.

Note: This library requires use of the #![feature(generic_const_exprs)] flag.

Usage:

#![feature(generic_const_exprs)]

/// Only allows for arguments of `C` to be alphabetic
struct AlphabeticTest<const C: char>
where 
    checks::char::Alphabetic<C>: 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:

const fn is_binary(num: u8) -> bool { num == 0 || num == 1 }
struct BinaryOnly<const N: u8> 
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:

check! { u8 =>
    /// Matches all binary numbers (0, 1)
    Binary(
        passes: 0, 1
        fails: 2, 3, 4
    ): |N| (N == 0 || N == 1)
}

struct BinaryOnly<const N: u8>
where
    Binary<N>: 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.

Commit count: 36

cargo fmt