/// Asserts that a given configuration is set. /// /// # Examples /// /// A project will simply fail to compile if the given configuration is not set. /// /// ``` /// # #[macro_use] extern crate static_assertions; fn main() {} /// // We're not masochists /// # #[cfg(not(target_pointer_width = "16"))] // Just in case /// assert_cfg!(not(target_pointer_width = "16")); /// ``` /// /// If a project does not support a set of configurations, you may want to /// report why. There is the option of providing a compile error message string: /// /// ``` /// # #[macro_use] extern crate static_assertions; fn main() {} /// # #[cfg(any(unix, windows))] /// assert_cfg!(any(unix, windows), "There is only support for Unix or Windows"); /// /// // User needs to specify a database back-end /// # #[cfg(target_pointer_width = "0")] // Impossible /// assert_cfg!(all(not(all(feature = "mysql", feature = "mongodb")), /// any( feature = "mysql", feature = "mongodb")), /// "Must exclusively use MySQL or MongoDB as database back-end"); /// ``` /// /// Some configurations are impossible. For example, we can't be compiling for /// both macOS _and_ Windows simultaneously: /// /// ```compile_fail /// # #[macro_use] extern crate static_assertions; fn main() {} /// assert_cfg!(all(target_os = "macos", /// target_os = "windows"), /// "No, that's not how it works! ಠ_ಠ"); /// ``` #[macro_export] macro_rules! assert_cfg { () => {}; ($($cfg:meta)+, $msg:expr $(,)?) => { #[cfg(not($($cfg)+))] compile_error!($msg); }; ($($cfg:tt)*) => { #[cfg(not($($cfg)*))] compile_error!(concat!("Cfg does not pass: ", stringify!($($cfg)*))); }; }