Macro nar_dev_utils::mods

source ·
macro_rules! mods {
    {} => { ... };
    {@SINGLE $([$cfg:meta])* $mod_name:ident } => { ... };
    {@SINGLE $([$cfg:meta])* pub $mod_name:ident } => { ... };
    {@SINGLE $([$cfg:meta])* use $mod_name:ident } => { ... };
    {@SINGLE $([$cfg:meta])* use pub $mod_name:ident } => { ... };
    {@SINGLE $([$cfg:meta])* pub use $mod_name:ident } => { ... };
    {@SINGLE $([$cfg:meta])* pub pub $mod_name:ident } => { ... };
    {@SINGLE $feature_name:literal => $($pub_use_mod:ident)+ } => { ... };
    {@SINGLE (!$feature_name:literal) => $($pub_use_mod:ident)+ } => { ... };
    { $feature_setting:tt => $($pub_use_mod:ident)+ ; $($tail:tt)* } => { ... };
    { $($pub_use_mod:ident)+ ; $($tail:tt)* } => { ... };
}
Expand description

批量封装:在限定的特性(feature)下,导入并重新导出模块

  • 🎯用于简化重复的#[cfg(feature = XXX)]以及(pub) mod(pub) use逻辑
  • ✨使用简化的「mod-pub-use」语法(无需)
    • <module> => mod
    • pub <module> => pub mod
    • 🆕use <module> => mod + use
    • 🆕pub use <module> => mod + pub use
    • 🆕use pub <module> => pub mod + use
    • 🆕pub pub <module> => pub mod + pub use
  • ✨简化【依赖于特性】的「mod-pub-use」语法(会同时应用在moduse语句中)
    • 🆕"feature" => <mod-pub-use> => #[cfg(feature = "feature")] <mod-pub-use>
    • 🆕(!"feature") => <mod-pub-use> => #[cfg(not(feature = "feature"))] <mod-pub-use>
  • 🚩使用「标签树撕咬机」模型
  • ⚠️已知问题:无法以此覆盖【内部导出了宏】的模块

§用例

mods! {
    mod1;
    pub mod2;
    use mod3;
    pub use mod4;
    use pub mod5;
    pub pub mod6;
    "feature1" => pub pub mod7;
    (!"feature1") => pub pub mod8;
}

=>

mod mod1;

pub mod mod2;

mod mod3;
use mod3::*;

mod mod4;
pub use mod4::*;

pub mod mod5;
use mod5::*;

pub mod mod6;
pub use mod6::*;

#[cfg(feature = "feature1")]
pub mod mod7;
#[cfg(feature = "feature1")]
pub use mod7::*;

#[cfg(not(feature = "feature1"))]
pub mod mod8;
#[cfg(not(feature = "feature1"))]
pub use mod8::*;