#camel-case #case #snake-case #proc-macro #macro #snake #camel

rename-item

过程宏,用于根据不同的命名风格在声明时重命名项目

2个版本

0.1.1 2023年6月9日
0.1.0 2022年5月25日

#13#camel-case

Download history 144/week @ 2024-03-13 35/week @ 2024-03-20 25/week @ 2024-03-27 55/week @ 2024-04-03 55/week @ 2024-04-10 106/week @ 2024-04-17 67/week @ 2024-04-24 29/week @ 2024-05-01 26/week @ 2024-05-08 78/week @ 2024-05-15 102/week @ 2024-05-22 48/week @ 2024-05-29 50/week @ 2024-06-05 53/week @ 2024-06-12 115/week @ 2024-06-19 195/week @ 2024-06-26

420 每月下载量
用于 2 crates

MIT/Apache

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参数中提取的单词执行的;下面的prefixsuffix参数不受样式转换的影响。请参考下表以获取支持样式列表。对于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 LicenseApache License, Version 2.0,由您选择。

除非您明确声明,否则您提交给此crate的任何贡献,根据Apache-2.0许可定义,均应按上述方式双许可,不附加任何其他条款或条件。

依赖关系

~0.6–1.1MB
~25K SLoC