3个不稳定版本
0.3.6 | 2024年6月21日 |
---|---|
0.3.1 | 2024年6月21日 |
0.1.0 | 2024年5月5日 |
#60 in #re-exports
在 5 个crate中使用
6KB
export-magic
export-magic
是一个Rust crate,旨在通过宏简化模块管理和重新导出。
它提供了一组强大的宏,允许开发者轻松管理模块导入和导出,减少样板代码并提高代码组织。
功能
x!
:自动定义并从指定模块重新导出所有内容。xp!
:定义一个模块,并使用其项目而无需重新导出它们。ix!
:使用单个宏调用导入crate根目录和特定导入
模块中的所有项目。
示例用法
使用 xp! 宏
如果您想在另一个模块中使用来自模块 bar 的所有项目,而无需重新导出它们
xp!(bar);
通常,这在 proc_macro crate 中的 src/lib.rs
文件中很有用。
例如,在 error-tree
proc_macro crate 中,我们有以下 lib.rs
文件
extern crate proc_macro;
#[macro_use] mod imports; use imports::*;
xp!{conversion_chain}
xp!{error_enum}
xp!{error_field}
xp!{error_tree_parse}
xp!{error_tree_visitor}
xp!{error_tree}
xp!{error_variant}
xp!{errors}
xp!{from_impl_generation_config}
xp!{from_impl_generation_config_emitter}
xp!{types}
xp!{validate}
#[proc_macro]
pub fn error_tree(input: TokenStream) -> TokenStream {
let error_tree = parse_macro_input!(input as ErrorTree);
error_tree.into_token_stream().into()
}
在这里,我们使用 xp!
宏调用使列表中源文件中找到的模型在我们的 error_tree
函数调用中可用。
这可以在不需要向 error_tree
crate 消费者公开这些底层模型的情况下工作。
使用 ix! 宏
将您的crate的根目录和导入模块中的所有内容导入到当前作用域
ix!();
我们通常在每个源文件顶部使用此宏调用,以使公开定义的相邻项在我们的文件中可用,而无需样板代码。
它还将来自 src/imports.rs
的第三方项引入调用源文件。
在上面的 xp!
示例中,我们在每个文件顶部(conversion_chain.rs、error_enum.rs、error_field.rs 等)使用 crate::ix!()
。
因此,我们可以编写整个系统,而无需很多使用语句的样板代码。
通常,src/imports.rs
将看起来像这样
pub(crate) use std::sync::Arc;
pub(crate) use std::fs::*;
在 src/imports.rs
中指定的任何内容都将对调用 crate::ix!()
的任何 src/sourcefile.rs
可用。
使用 x!
宏
假设你有一个模块 foo
,其中包含各种公共结构和函数,并且你希望将它们暴露在库的根目录下。只需使用
x!(foo);
这使得我们能够干净且容易地组织我们的crate,使其内容可供客户端使用。通常,我们的 src/lib.rs
文件可能看起来就像这样,不多也不少
#[macro_use] mod imports; use imports::*;
x!{errors}
x!{traits}
x!{sourcefile1}
x!{sourcefile2}
x!{sourcefile3}
在每个文件 src/errors.rs
、src/traits.rs
、src/sourcefile1.rs
、src/sourcefile2.rs
等,我们将在顶部指定 crate::ix!()
(见上面章节)。
任何第三方依赖都通过在 src/imports.rs
中使用 pub(crate) use some_third_party_dep::*
来导出,因此所有源文件都变得非常干净。
安装
将此添加到你的 Cargo.toml
[dependencies]
export-magic = "0.1.0"
许可证
本crate采用MIT许可证。