#variant-name #field-name #struct-fields #enums #slice #return #static

fievar

生成返回结构体字段名或枚举变体名静态切片的函数的过程宏

4个版本

0.2.0 2022年8月5日
0.1.2 2022年6月9日
0.1.1 2022年6月8日
0.1.0 2022年6月8日

1533 in 过程宏

MIT许可证

25KB
531 代码行

该crate提供过程宏,用于生成返回结构体字段名或枚举变体名静态切片的函数。

示例

use fievar::Fields;

#[derive(Fields)]
struct File {
    id: String,
    name: String,
    mime_type: String,
}

assert_eq!(&["id", "name", "mime_type"], File::fields());

您还可以重命名字段。

use fievar::Fields;

#[derive(Fields)]
struct File {
    id: String,
    name: String,
    #[fievar(name = "mimeType")]
    mime_type: String,
}

assert_eq!(&["id", "name", "mimeType"], File::fields());

转换

语法

表达式
   [[T][|Sep]]

Sep: 词分隔符。
   可以是任何文本。

T: 确定如何转换字段/变体。
   [[TrCase][ NumAlign]]

NumAlign: 控制数字的对齐。
   1__ | __1 | _1_

TrCase: 控制字母的大小写。
   [TrWord[ TrWord[ TrWord]]]

TrWord: 控制单个单词的大小写。
   [TrChar[TrChar[TrChar]]]

TrChar: 控制单词中单个字符的大小写。
   c | C

TrCase 由最多三个用空格分隔的 TrWord 组成。如果只有一个 TrWord,则用于转换字段/变体中的所有单词。如果有两个 TrWord,则第一个 TrWord 应用于字段/变体的第一个单词,第二个 TrWord 应用于其余单词。如果有三个 TrWord,则第一个和最后一个 TrWord 应用于字段/变体的第一个和最后一个单词,第二个 TrWord 应用于其余单词。 TrChar 以类似的方式作用于单词中的字符。

示例

use fievar::Variants;

#[derive(Variants)]
enum E {
    #[fievar(transform = "c")] // lowercase
    AVeryLong0Variant,

    #[fievar(transform = "C")] // uppercase
    AVeryLong1Variant,

    #[fievar(transform = "1__|_")] // align numeral left
    AVeryLong2Variant,

    #[fievar(transform = "__1|_")] // align numeral right
    AVeryLong3Variant,

    #[fievar(transform = "_1_|_")] // align numeral middle
    AVeryLong4Variant,

    #[fievar(transform = "c Cc")] // camelCase
    AVeryLong5Variant,

    #[fievar(transform = "c|_")] // snake_case
    AVeryLong6Variant,

    #[fievar(transform = "CcC cCc CcC _1_|*-*")] // something different
    LastVeryLong7Variant,
}

let v = &[
    "averylong0variant",
    "AVERYLONG1VARIANT",
    "A_Very_Long2_Variant",
    "A_Very_Long_3Variant",
    "A_Very_Long_4_Variant",
    "aVeryLong5Variant",
    "a_very_long6_variant",
    "LasT*-*vERy*-*lONg*-*7*-*VarianT"
];
assert_eq!(v, E::variants());

依赖关系

~1.5MB
~37K SLoC