#proc-macro #macro #export #reflection #macro-magic #self-contained #no-alloc

no-std mini-macro-magic

将令牌导出到其他模块和crate。现在100%减少了proc宏!

4 个稳定版本

2.0.2 2023年12月16日
1.0.0 2023年6月28日

#489 in Rust 模式

MIT/Apache

22KB
207

Version Crates.io docs.rs Crates.io

::mini-macro-magic 🪄

将令牌导出到其他模块或crate。现在100%减少了proc宏!

查看集成测试,了解为什么需要使用export

该crate提供export宏,允许导出令牌。该概念类似于此crate的灵感来源macro_magic。也就是说,生成一个macro_rules!。这个macro_rules!将调用传入的宏并使用导出的令牌。

macro_magic的不同之处在于,此crate使用一个macro_rules!宏来完成所有操作。如果您不需要macro_magic的全部功能,就不需要在这些proc宏中进行轮询。相反,使用export来生成一个您或依赖项crate可以使用的宏。此外,依赖项crate不需要了解mini_macro_magic就可以使用生成的macro_rules!。它们完全自包含。

export宏允许进行一种形式的反射。通过检查定义的令牌来检查项目的定义。由于macro_rules(以及Rust宏)无法主动展开它们的输入,因此export创建了一个宏,您可以传递另一个宏调用以便它展开。

use mini_macro_magic::{export, emit};

// Export the definition of `MyStruct`.
// Note without using `emit!()` `MyStruct` isn't actually created in this scope.
export!(
    #[export(my_struct$)]
    {
        struct MyStruct;
    }
);

// An example macro that can parse a struct definition and get the name
// of the struct as a string.
macro_rules! name_of_struct {
    {{
        $(#[$($attr:tt)*])*
        $vis:vis struct $name:ident;
    }} => {
        stringify!($name)
    };
}

// Invoke `name_of_struct` with the definition of `MyStruct`.
assert_eq!(my_struct!(name_of_struct!()), "MyStruct");

#![no_std]

mini_macro_magic#![no_std],它可以在 Rust 可用的任何地方使用。

支持的最低 Rust 版本

需要 Rust 1.56.0。

此 crate 遵循 "最新稳定 Rust" 政策。列出的最低支持版本除非必要不会更改。然而,更新到发布时的最新稳定版本是允许的。


许可证

可以选择根据您的意愿在 Apache 许可证 2.0 版MIT 许可证 下进行许可。
除非您明确表示,否则根据 Apache-2.0 许可证定义的,您提交给 mini-macro-rules 的任何有意贡献将根据上述方式进行双重许可,不附加任何额外条款或条件。

无运行时依赖