1/// Asserts that a given configuration is set. 2/// 3/// # Examples 4/// 5/// A project will simply fail to compile if the given configuration is not set. 6/// 7/// ``` 8/// # #[macro_use] extern crate static_assertions; fn main() {} 9/// // We're not masochists 10/// # #[cfg(not(target_pointer_width = "16"))] // Just in case 11/// assert_cfg!(not(target_pointer_width = "16")); 12/// ``` 13/// 14/// If a project does not support a set of configurations, you may want to 15/// report why. There is the option of providing a compile error message string: 16/// 17/// ``` 18/// # #[macro_use] extern crate static_assertions; fn main() {} 19/// # #[cfg(any(unix, windows))] 20/// assert_cfg!(any(unix, windows), "There is only support for Unix or Windows"); 21/// 22/// // User needs to specify a database back-end 23/// # #[cfg(target_pointer_width = "0")] // Impossible 24/// assert_cfg!(all(not(all(feature = "mysql", feature = "mongodb")), 25/// any( feature = "mysql", feature = "mongodb")), 26/// "Must exclusively use MySQL or MongoDB as database back-end"); 27/// ``` 28/// 29/// Some configurations are impossible. For example, we can't be compiling for 30/// both macOS _and_ Windows simultaneously: 31/// 32/// ```compile_fail 33/// # #[macro_use] extern crate static_assertions; fn main() {} 34/// assert_cfg!(all(target_os = "macos", 35/// target_os = "windows"), 36/// "No, that's not how it works! ಠ_ಠ"); 37/// ``` 38#[macro_export] 39macro_rules! assert_cfg { 40 () => {}; 41 ($($cfg:meta)+, $msg:expr $(,)?) => { 42 #[cfg(not($($cfg)+))] 43 compile_error!($msg); 44 }; 45 ($($cfg:tt)*) => { 46 #[cfg(not($($cfg)*))] 47 compile_error!(concat!("Cfg does not pass: ", stringify!($($cfg)*))); 48 }; 49} 50