Есть ли способ использовать проверку 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]
дважды.