Есть ли способ использовать проверку cfg (feature) для нескольких операторов?

Есть ли способ свести к минимуму следующие проверки функций?

#[cfg(feature = "eugene")]
pub mod eugene_set_steam_id;
#[cfg(feature = "eugene")]
pub mod eugene_balance;
#[cfg(feature = "eugene")]
pub mod eugene_force_map;
#[cfg(feature = "eugene")]
pub mod eugene_rating;
#[cfg(feature = "eugene")]
pub mod eugene_stat;
#[cfg(feature = "eugene")]
pub mod eugene_steam_id;
#[cfg(feature = "eugene")]
pub mod eugene_top;

Что-то вроде:

#[cfg(feature = "eugene")] {
    pub mod eugene_set_steam_id;
    pub mod eugene_balance;
    pub mod eugene_force_map;
    pub mod eugene_rating;
    pub mod eugene_stat;
    pub mod eugene_steam_id;
    pub mod eugene_top;
}

Это лучше передаст смысл и станет более эргономичным.

Ответ 1

cfg-if crate предоставляет макрос cfg-if!, который должен делать то, что вы хотите:

#[macro_use]
extern crate cfg_if;

cfg_if! {
    if #[cfg(feature = "eugene")] {
        pub mod eugene_set_steam_id;
        pub mod eugene_balance;
        pub mod eugene_force_map;
        pub mod eugene_rating;
        pub mod eugene_stat;
        pub mod eugene_steam_id;
        pub mod eugene_top;
    } else {
    }
}

Фактически, он даже описывает себя, используя ваши слова:

Макрос для эргономического определения элемента в зависимости от большого количества параметров #[cfg]. Структурированный как цепочка if-else, первая соответствующая ветвь - это элемент, который испускается.

Ответ 2

Вы можете создать приватный модуль, который импортирует все файлы, а затем позволить родительскому модулю реэкспортировать все из этого приватного модуля:

#[cfg(feature = "eugene")]
#[path = ""]
mod reexport_eugene_modules {
    pub mod eugene_set_steam_id;
    pub mod eugene_balance;
    pub mod eugene_force_map;
    pub mod eugene_rating;
    pub mod eugene_stat;
    pub mod eugene_steam_id;
    pub mod eugene_top;
}

#[cfg(feature = "eugene")]
pub use reexport_eugene_modules::*;

Вам все равно нужно написать эту строку #[cfg] дважды.