2个版本
0.1.1 | 2023年6月9日 |
---|---|
0.1.0 | 2022年5月25日 |
#13 在 #camel-case
420 每月下载量
用于 2 crates
21KB
227 行
rename-item
过程宏,用于根据不同的命名风格在声明时重命名项目。
此crate提供了一个类似属性的宏macro@rename
,用于更改其应用项的名称。为了引用更改后的名称,此crate提供了一个类似函数的宏renamed!
。
这两个宏接受相同的四个命名参数来指定生成的名称
-
name
参数指定生成的名称将由哪些单独的组件组成。它可以是单个字符串字面量,如name = "foo"
,也可以是字符串字面量或标识符的列表,如name("foo", bar)
。这些组件将进一步分割成单独的单词:name("fooBar")
产生与name("foo", "bar")
相同的结果。这种分割是通过heck
crate完成的,并遵循其单词边界的定义。《name》参数始终是必需的。 -
参数
case
指定生成的名称将遵循的样式。它必须是一个字符串字面量,例如case = "snake"
。这种样式转换是对从name
参数中提取的单词执行的;下面的prefix
和suffix
参数不受样式转换的影响。请参考下表以获取支持样式列表。对于case
参数,始终是renamed!
宏所必需的;对于macro@rename
宏,可以从注解项的类型中推断出默认的样式。 -
参数
prefix
指定要添加到生成名称中的额外字符串字面量。这是在样式转换之后执行的,因此前缀字符串保持固定,不受目标样式的影响。prefix
参数是可选的,默认为空字符串。 -
参数
suffix
指定要附加到生成名称中的额外字符串字面量。这是在样式转换之后执行的,因此后缀字符串保持固定,不受目标样式的影响。suffix
参数是可选的,默认为空字符串。
支持以下样式
样式 | case= |
示例 |
---|---|---|
大驼峰式 | "upper_camel" |
FooBar |
小驼峰式 | "lower_camel" |
fooBar |
蛇形式 | "snake" |
foo_bar |
大写蛇形式 | "shouty_snake" |
FOO_BAR |
这个crate主要用于编写声明式宏,因为声明式宏不能创建新的标识符。此外,这个crate允许声明式宏根据给定的名称调整各种样式,这在宏定义不同类型的项时很有用。
示例
use rename_item::{rename, renamed};
// This function has the name `_return_five`
#[rename(name = "return-five", prefix = "_")]
fn foo() -> i32 {
5
}
assert_eq!(_return_five(), 5);
// This obtains the name of the function using the macro arguments from above, and calls it
let five = renamed!(name = "return-five", case = "snake", prefix = "_")();
assert_eq!(five, 5);
这是一个具体的例子,一个声明式宏,用于定义结构成员的setter
macro_rules! struct_with_setters {
(
// Match a normal struct definition
struct $name:ident {
$($member:ident: $ty:ty),* $(,)?
}
) => {
// Emit the same struct definition
struct $name {
$($member: $ty,)*
}
// Additionally emit an impl block with a setter function for each member
impl $name {
$(
#[::rename_item::rename(name($member), prefix = "set_")]
fn foo(&mut self, val: $ty) {
self.$member = val;
}
)*
}
};
}
struct_with_setters! {
struct Highscore {
score: i32,
player: String,
}
}
let mut h = Highscore {
score: 42,
player: "Hackerman".into(),
};
h.set_score(9001);
assert_eq!(h.score, 9001);
许可
许可为MIT License或Apache License, Version 2.0,由您选择。
除非您明确声明,否则您提交给此crate的任何贡献,根据Apache-2.0许可定义,均应按上述方式双许可,不附加任何其他条款或条件。
依赖关系
~0.6–1.1MB
~25K SLoC