在适当的情况下自动转换所有标识符



例如

pub enum Format {
Undefined,
R4g4UnormPack8,
R4g4b4a4UnormPack16,
B4g4r4a4UnormPack16,
R5g6b5UnormPack16,
B5g6r5UnormPack16,
R5G5B5A1_UNORM_PACK16,
B5G5R5A1_UNORM_PACK16,
A1R5G5B5_UNORM_PACK16,
R8_UNORM,
//...
G10X6_B10X6_R10X6_3PLANE_420_UNORM_3PACK16,
//...
}

前6行由我使用rust-analyzer代码操作对每一行进行手动转换。

但是你可以猜到这个列表很长,我正在寻找一种方法来完成这些。就像在构建时,它警告我转换它。

warning: variant `G10X6_B10X6_R10X6_3PLANE_420_UNORM_3PACK16` should have an upper camel case name
--> src/core.rs:388:5
|
388 |     G10X6_B10X6_R10X6_3PLANE_420_UNORM_3PACK16,
|     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: convert the identifier to upper camel case: `G10x6B10x6R10x6_3plane420Unorm3pack16`

我还想转换它。有办法做到这一点吗?如有任何帮助,不胜感激。

可以用rustfix修复它,但根据github问题,这个lint被过滤掉了,它可以通过设置env var(ref)来包含。

Windows:

set __CARGO_FIX_YOLO="yolo"
cargo fix

export __CARGO_FIX_YOLO="yolo"
cargo fix

重要:

请注意,这将尝试修复源代码中的所有内容,这可能会带来不必要的副作用,您可能需要检查cargo fix ref,或者您可以通过将您的结构复制到普通的新项目中,然后在修复后重新添加到您的项目中。

在被问到这个问题后,我一直在研究我的实现。我想这是可行的。

这是我的代码。

#[derive(Debug, Clone, Copy, PartialEq, Eq)]
enum CharClass {
Alphabetic,
Digit,
}
fn convert(text: &str) -> String {
let mut previous = None;
let mut current = CharClass::Alphabetic;
let mut result = String::with_capacity(text.len());
result.push_str(text.get(..1).unwrap());
for ch in text.chars().skip(1) {
match previous {
// `previous` is only `Some` if encountered '_'.
Some(t) => {
match t {
CharClass::Alphabetic => {
if ch.is_ascii_alphabetic() {
current = CharClass::Alphabetic;
} else if ch.is_ascii_digit() {
current = CharClass::Digit;
}
result.push(ch);
}
CharClass::Digit => {
if ch.is_ascii_alphabetic() {
current = CharClass::Alphabetic;
result.push(ch);
} else if ch.is_ascii_digit() {
current = CharClass::Digit;
result.push('_');
result.push(ch);
}
}
}
previous = None;
}
None => {
if ch.is_ascii_alphabetic() {
current = CharClass::Alphabetic;
result.push(ch.to_ascii_lowercase());
} else if ch.is_ascii_digit() {
current = CharClass::Digit;
result.push(ch);
} else if ch == '_' {
previous = Some(current);
} else {
result.push(ch);
}
}
}
}
result
}
fn main() {
assert_eq!(
"G10x6B10x6R10x6_3plane420Unorm3pack16",
&convert("G10X6_B10X6_R10X6_3PLANE_420_UNORM_3PACK16")
);
assert_eq!(
"Astc12x12SfloatBlockExt",
&convert("ASTC_12x12_SFLOAT_BLOCK_EXT")
);
}

最新更新