#exclusive #features #macro #mutually #mutually-exclusive

no-std mutually_exclusive_features

Macros to check that only none or one of a set of features is enabled at a time, as known as mutually exclusive features

2 unstable releases

0.1.0 Feb 5, 2024
0.0.3 Nov 9, 2023
0.0.2 Nov 9, 2023
0.0.1 Nov 9, 2023

#294 in Rust patterns

Download history 24225/week @ 2024-01-18 23145/week @ 2024-01-25 21140/week @ 2024-02-01 23008/week @ 2024-02-08 24457/week @ 2024-02-15 25972/week @ 2024-02-22 24322/week @ 2024-02-29 28441/week @ 2024-03-07 30057/week @ 2024-03-14 29343/week @ 2024-03-21 25181/week @ 2024-03-28 30350/week @ 2024-04-04 29007/week @ 2024-04-11 34618/week @ 2024-04-18 36156/week @ 2024-04-25 32272/week @ 2024-05-02

138,167 downloads per month
Used in 44 crates (4 directly)

MIT/Apache

8KB

Mutually Exclusive Features

crates.io Build Status docs

Macros to check mutually exclusive features in Rust


It contains none_or_one_of and exactly_one_of macros.

Both check mutually exclusive features in Rust, but none_or_one_of allows for no features to be enabled, while exactly_one_of requires exactly one feature to be enabled.

Usage


none_or_one_of


Call it with the list of features you want to be mutually exclusive:

use mutually_exclusive_features::none_or_one_of;
none_or_one_of!("feature1", "feature2", "feature3");

Which will generate the following code:

#[cfg(all(feature="feature1", feature="feature2"))]
compile_error!("The `feature1` and `feature2` features are mutually exclusive and cannot be enabled at the same time!");

#[cfg(all(feature="feature1", feature="feature3"))]
compile_error!("The `feature1` and `feature3` features are mutually exclusive and cannot be enabled at the same time!");

#[cfg(all(feature="feature2", feature="feature3"))]
compile_error!("The `feature2` and `feature3` features are mutually exclusive and cannot be enabled at the same time!");

exactly_one_of


It's the same, but requires exactly one feature to be enabled:

use mutually_exclusive_features::exactly_one_of;
exactly_one_of!("feature1", "feature2", "feature3");

Which will generate the following code:

#[cfg(all(feature="feature1", feature="feature2"))]
compile_error!("The `feature1` and `feature2` features are mutually exclusive and cannot be enabled at the same time!");

#[cfg(all(feature="feature1", feature="feature3"))]
compile_error!("The `feature1` and `feature3` features are mutually exclusive and cannot be enabled at the same time!");

#[cfg(all(feature="feature2", feature="feature3"))]
compile_error!("The `feature2` and `feature3` features are mutually exclusive and cannot be enabled at the same time!");

#[cfg(not(any(feature="feature1", feature="feature2", feature="feature3")))]
compile_error!("You must enable exactly one of `feature1`, `feature2`, `feature3` features!");

No runtime deps