1 个不稳定版本
0.1.0 | 2024 年 8 月 5 日 |
---|
979 在 Rust 模式
111 每月下载次数
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