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 ] |
39 | macro_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 | |