1

例如,

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`

我也想转换它。有没有办法做到这一点?任何帮助表示赞赏。

4

2 回答 2

2

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

对于 Windows:

set __CARGO_FIX_YOLO="yolo"
cargo fix

基于 Unix:

export __CARGO_FIX_YOLO="yolo"
cargo fix

重要的 :

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

于 2021-08-04T11:33:39.647 回答
1

问完这个问题后,我一直在努力实施。我想它有效。

这是我的代码。

#[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")
    );
}
于 2021-08-04T12:13:04.070 回答