azalea_inventory_macros/
utils.rs

1pub fn to_pascal_case(s: &str) -> String {
2    // we get the first item later so this is to make it impossible for that
3    // to error
4    if s.is_empty() {
5        return String::new();
6    }
7
8    let mut result = String::new();
9    let mut prev_was_underscore = true; // set to true by default so the first character is capitalized
10    if s.chars().next().unwrap().is_numeric() {
11        result.push('_');
12    }
13    for c in s.chars() {
14        if c == '_' {
15            prev_was_underscore = true;
16        } else if prev_was_underscore {
17            result.push(c.to_ascii_uppercase());
18            prev_was_underscore = false;
19        } else {
20            result.push(c);
21        }
22    }
23    result
24}
25
26pub fn to_snake_case(s: &str) -> String {
27    let mut result = String::new();
28    let mut prev_was_uppercase = true;
29    for c in s.chars() {
30        if c.is_ascii_uppercase() {
31            if !prev_was_uppercase {
32                result.push('_');
33            }
34            result.push(c.to_ascii_lowercase());
35            prev_was_uppercase = true;
36        } else {
37            result.push(c);
38            prev_was_uppercase = false;
39        }
40    }
41    result
42}
43
44#[cfg(test)]
45mod tests {
46    use super::*;
47
48    #[test]
49    fn test_snake_case() {
50        assert_eq!(to_snake_case("HelloWorld"), "hello_world");
51        assert_eq!(to_snake_case("helloWorld"), "hello_world");
52        assert_eq!(to_snake_case("hello_world"), "hello_world");
53    }
54}