zvariant_utils/
case.rs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
//! Contains utilities used to convert strings between different cases.

/// Convert to pascal or camel case, assuming snake or kebab case.
///
/// If `s` is already in pascal or camel case, should yield the same result.
pub fn pascal_or_camel_case(s: &str, is_pascal_case: bool) -> String {
    let mut result = String::new();
    let mut capitalize = is_pascal_case;
    let mut first = true;
    for ch in s.chars() {
        if ch == '_' || ch == '-' {
            capitalize = true;
        } else if capitalize {
            result.push(ch.to_ascii_uppercase());
            capitalize = false;
        } else if first && !is_pascal_case {
            result.push(ch.to_ascii_lowercase());
        } else {
            result.push(ch);
        }

        if first {
            first = false;
        }
    }
    result
}

/// Convert to snake or kebab case, assuming camel or Pascal case.
///
/// If `s` is already in snake or kebab case, should yield the same result.
pub fn snake_or_kebab_case(s: &str, is_snake_case: bool) -> String {
    let mut result = String::new();
    for ch in s.chars() {
        if ch.is_ascii_uppercase() && !result.is_empty() {
            if is_snake_case {
                result.push('_');
            } else {
                result.push('-');
            }
        };

        if ch == '_' || ch == '-' {
            if is_snake_case {
                result.push('_');
            } else {
                result.push('-');
            }
        } else {
            result.push(ch.to_ascii_lowercase());
        }
    }
    result
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn test_pascal_case() {
        assert_eq!("FooBar", pascal_or_camel_case("foo_bar", true));
        assert_eq!("FooBar", pascal_or_camel_case("fooBar", true));
        assert_eq!("FooBar", pascal_or_camel_case("foo-bar", true));
        assert_eq!("FooBar", pascal_or_camel_case("FooBar", true));
    }

    #[test]
    fn test_camel_case() {
        assert_eq!("fooBar", pascal_or_camel_case("foo_bar", false));
        assert_eq!("fooBar", pascal_or_camel_case("fooBar", false));
        assert_eq!("fooBar", pascal_or_camel_case("foo-bar", false));
        assert_eq!("fooBar", pascal_or_camel_case("FooBar", false));
    }

    #[test]
    fn test_snake_case() {
        assert_eq!("foo_bar", snake_or_kebab_case("foo_bar", true));
        assert_eq!("foo_bar", snake_or_kebab_case("fooBar", true));
        assert_eq!("foo_bar", snake_or_kebab_case("foo-bar", true));
        assert_eq!("foo_bar", snake_or_kebab_case("FooBar", true));
    }

    #[test]
    fn test_kebab_case() {
        assert_eq!("foo-bar", snake_or_kebab_case("foo_bar", false));
        assert_eq!("foo-bar", snake_or_kebab_case("fooBar", false));
        assert_eq!("foo-bar", snake_or_kebab_case("foo-bar", false));
        assert_eq!("foo-bar", snake_or_kebab_case("FooBar", false));
    }
}