macro_rules! match_cfg {
    (#[cfg($cfg:meta)] => { $($i:item)* }) => { ... };
    (#[cfg($cfg:meta)] @ #[cfg($cfg_not:meta)] => { $($i:item)* }) => { ... };
    (_ => { $($i:item)* }) => { ... };
    (_ @ #[cfg($cfg_not:meta)] => { $($i:item)* }) => { ... };
    (
        #[cfg($cfg0:meta)] => { $($i:item)* }
        $(#[cfg($cfgs:meta)] => { $($is:item)* })*
    ) => { ... };
    (
        $(#[cfg($cfgs:meta)] => { $($is:item)* })*
        _ => { $($ni:item)* }
    ) => { ... };
}
Expand description

The macro provided by this crate, match_cfg, is similar to the if/elif C preprocessor directives and allows defining a cascade of #[cfg] cases, emitting the implementation which matches first.

This conveniently allows providing a long list #[cfg]’d blocks of code without having to rewrite each cfg() clause multiple times.

Example

#[macro_use(match_cfg)]
extern crate match_cfg;

match_cfg! {
    #[cfg(unix)] => {
        fn foo() { /* unix specific functionality */ }
    }
    #[cfg(target_pointer_width = "32")] => {
        fn foo() { /* non-unix, 32-bit functionality */ }
    }
    _ => {
        fn foo() { /* fallback implementation */ }
    }
}