#[doc = crate::doc_!(vendor: "cfg-if")]
#[macro_export]
#[cfg_attr(cargo_primary_package, doc(hidden))]
macro_rules! cfg_if {
( $( if #[cfg( $i_meta:meta )] { $( $i_tokens:tt )* } ) else+
else { $( $e_tokens:tt )* }
) => {
$crate::cfg_if! {
@__items () ;
$( (( $i_meta ) ( $( $i_tokens )* )) , )+
(() ( $( $e_tokens )* )) ,
}
};
( $( if #[cfg( $i_meta:meta )] { $( $i_tokens:tt )* } ) else+
else { $( $e_tokens:tt )* }
if $($extra_conditions:tt)+
) => {
$crate::cfg_if! {
@__items () ;
$( (( $i_meta ) ( $( $i_tokens )* )) , )+
(() ( $( $e_tokens )* )) ,
}
$crate::cfg_if! { if $($extra_conditions)+ }
};
( if #[cfg( $i_meta:meta )] { $( $i_tokens:tt )* }
$( else if #[cfg( $e_meta:meta )] { $( $e_tokens:tt )* } )*
) => {
$crate::cfg_if! {
@__items () ;
(( $i_meta ) ( $( $i_tokens )* )) ,
$( (( $e_meta ) ( $( $e_tokens )* )) , )*
}
};
( if #[cfg( $i_meta:meta )] { $( $i_tokens:tt )* }
$( else if #[cfg( $e_meta:meta )] { $( $e_tokens:tt )* } )*
if $($extra_conditions:tt)+
) => {
$crate::cfg_if! {
@__items () ;
(( $i_meta ) ( $( $i_tokens )* )) ,
$( (( $e_meta ) ( $( $e_tokens )* )) , )*
}
$crate::cfg_if! { if $($extra_conditions)+ }
};
(@__items ( $( $_:meta , )* ) ; ) => {};
( @__items ( $( $no:meta , )* ) ;
(( $( $yes:meta )? ) ( $( $tokens:tt )* )) ,
$( $rest:tt , )*
) => {
#[cfg(all(
$( $yes , )?
not(any( $( $no ),* ))
))]
$crate::cfg_if! { @__identity $( $tokens )* }
$crate::cfg_if! {
@__items ( $( $no , )* $( $yes , )? ) ;
$( $rest , )*
}
};
(@__identity $( $tokens:tt )* ) => {
$( $tokens )*
};
}
#[doc(inline)]
pub use cfg_if;
#[cfg(test)]
mod test_cfg_if {
#![allow(dead_code, unexpected_cfgs)]
use crate::cfg_if;
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(foo)] {
fn works6() -> bool { false }
} else if #[cfg(test)] {
fn works6() -> bool { true }
}
if #[cfg(test)] {
fn works7() -> bool { true }
} else {
fn works7() -> bool { false }
}
}
cfg_if! {
if #[cfg(test)] {
fn works8() -> bool { true }
} else if #[cfg(foo)] {
fn works8() -> bool { false }
}
if #[cfg(foo)] {
fn works9() -> bool { false }
} else if #[cfg(test)] {
fn works9() -> bool { true }
}
}
#[test]
fn it_works() {
assert!(works1().is_some());
assert!(works2());
assert!(works3());
assert!(works4().is_some());
assert!(works5());
}
#[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!();
}
}
}
}
}