#![no_std]
#![doc(html_root_url = "https://docs.rs/cfg-if")]
#![deny(missing_docs)]
#![cfg_attr(test, allow(unexpected_cfgs))]
#[macro_export]
macro_rules! cfg_if {
(
if #[cfg( $($i_meta:tt)+ )] { $( $i_tokens:tt )* }
$(
else if #[cfg( $($ei_meta:tt)+ )] { $( $ei_tokens:tt )* }
)*
$(
else { $( $e_tokens:tt )* }
)?
) => {
$crate::cfg_if! {
@__items () ;
(( $($i_meta)+ ) ( $( $i_tokens )* )),
$(
(( $($ei_meta)+ ) ( $( $ei_tokens )* )),
)*
$(
(() ( $( $e_tokens )* )),
)?
}
};
(@__items ( $( ($($_:tt)*) , )* ) ; ) => {};
(
@__items ( $( ($($no:tt)+) , )* ) ;
(( $( $($yes:tt)+ )? ) ( $( $tokens:tt )* )),
$( $rest:tt , )*
) => {
#[cfg(all(
$( $($yes)+ , )?
not(any( $( $($no)+ ),* ))
))]
$crate::cfg_if! { @__temp_group $( $tokens )* }
$crate::cfg_if! {
@__items ( $( ($($no)+) , )* $( ($($yes)+) , )? ) ;
$( $rest , )*
}
};
(@__temp_group $( $tokens:tt )* ) => {
$( $tokens )*
};
}
#[cfg(test)]
mod tests {
cfg_if! {
if #[cfg(test)] {
use core::option::Option as Option2;
fn works1() -> Option2<u32> { Some(1) }
} else {
fn works1() -> Option<u32> { None }
}
}
cfg_if! {
if #[cfg(foo)] {
fn works2() -> bool { false }
} else if #[cfg(test)] {
fn works2() -> bool { true }
} else {
fn works2() -> bool { false }
}
}
cfg_if! {
if #[cfg(foo)] {
fn works3() -> bool { false }
} else {
fn works3() -> bool { true }
}
}
cfg_if! {
if #[cfg(test)] {
use core::option::Option as Option3;
fn works4() -> Option3<u32> { Some(1) }
}
}
cfg_if! {
if #[cfg(foo)] {
fn works5() -> bool { false }
} else if #[cfg(test)] {
fn works5() -> bool { true }
}
}
cfg_if!(
if #[cfg(target_os = "no-such-operating-system-good-sir!")] {
type _A = usize;
type _B = usize;
} else {
type _A = i32;
type _B = i32;
}
);
#[cfg(not(msrv_test))]
cfg_if! {
if #[cfg(false)] {
fn works6() -> bool { false }
} else if #[cfg(true)] {
fn works6() -> bool { true }
} else if #[cfg(false)] {
fn works6() -> bool { false }
}
}
#[test]
fn it_works() {
assert!(works1().is_some());
assert!(works2());
assert!(works3());
assert!(works4().is_some());
assert!(works5());
#[cfg(not(msrv_test))]
assert!(works6());
}
#[test]
#[allow(clippy::assertions_on_constants)]
fn test_usage_within_a_function() {
cfg_if! {
if #[cfg(debug_assertions)] {
assert!(cfg!(debug_assertions));
assert_eq!(4, 2 + 2);
} else {
assert!(works1().is_some());
assert_eq!(10, 5 + 5);
}
}
}
#[allow(dead_code)]
trait Trait {
fn blah(&self);
}
#[allow(dead_code)]
struct Struct;
impl Trait for Struct {
cfg_if! {
if #[cfg(feature = "blah")] {
fn blah(&self) { unimplemented!(); }
} else {
fn blah(&self) { unimplemented!(); }
}
}
}
}