#ident #macro-rules #hash #macro #concat

ident-mash

在 macro_rules! 中将标识符混合在一起!

1 个不稳定版本

0.1.0 2024 年 8 月 5 日

979Rust 模式

Download history 111/week @ 2024-08-05

111 每月下载次数

MIT 许可证

13KB
285

Ident-Mash

你是否曾经有一堆标识符,你“只想在宏中混合在一起”,但又不想编写过程宏?

Ident-Mash 可以为你解决,因为它为你处理了讨厌的过程宏部分!

macro_rules! create_struct {
    ($name:ident) => {
        struct $name { ... }
        
        ident_mash::mash!{
            module = my_secret_ + :snake_case($name) + _module &
            constant = MY_SECRET_ + :upper_snake_case($name) + _CONST =>
            
            #[doc(hidden)]
            mod $module {
                const $constant: usize = 42;
                /* Secret stuff here */
            } }
        
         
    };
}

create_struct!(MyStruct);

功能

如示例所示,允许创建多个元变量,以及使用某些函数,如 :snake_case"字符串字面量" 而不是标识符。但还有其他函数,它们都接受标识符或其他函数的列表。实际上,它们支持递归。

名称 功能
:upper_case: 将所有内容转换为大写
:lower_case 将所有内容转换为小写
:snake_case 使用 convert_case 包将标识符转换为 snake_case
:upper_snake_case 相同的工作机制,但转换为 UPPER_SNAKE_CASE
:pascal_case 相同的工作机制,但转换为 PascalCase
:hash 在连接的标识符上计算哈希。对于生成确定性随机名称非常有用

极端示例: :hash(:snake_case(x + y + z) + x) + z + :hash(z)

更多示例

/tests 目录包含测试,展示了宏的所有可能用例,同时又不使理解变得过于困难。

错误

可能会破坏过程宏或产生意外的结果。宏的工作原理是搜索 $meta_var 模式并将其替换为生成的标识符。

但是,meta_var 的名称是你将作为第一个参数传递给 mash! 的参数。因此,避免给元变量赋予动态名称是很重要的。

例如,不要这样做

macro_rules! dangerous {
    ($name:ident) => {
        struct $name { ... }
        
        ident_mash::mash!{
            $name = my_secret_ + :snake_case($name) + _module &
            constant = MY_SECRET_ + :upper_snake_case($name) + _CONST =>
            
            #[doc(hidden)]
            mod $$name {
                const $constant: usize = 42;
                /* Secret stuff here */
            } }
        
         
    };
}

dangerous!(MaliciousName);

这个特定的例子甚至无法编译,但我认为它说明了可能存在的风险。

未来计划

未来可能会添加更多功能。如果您想看到添加的功能,请随时提交一个PR!

依赖关系

~0.8–1.3MB
~26K SLoC