zvariant_utils/
case.rs

1//! Contains utilities used to convert strings between different cases.
2
3/// Convert to pascal or camel case, assuming snake or kebab case.
4///
5/// If `s` is already in pascal or camel case, should yield the same result.
6pub fn pascal_or_camel_case(s: &str, is_pascal_case: bool) -> String {
7    let mut result = String::new();
8    let mut capitalize = is_pascal_case;
9    let mut first = true;
10    for ch in s.chars() {
11        if ch == '_' || ch == '-' {
12            capitalize = true;
13        } else if capitalize {
14            result.push(ch.to_ascii_uppercase());
15            capitalize = false;
16        } else if first && !is_pascal_case {
17            result.push(ch.to_ascii_lowercase());
18        } else {
19            result.push(ch);
20        }
21
22        if first {
23            first = false;
24        }
25    }
26    result
27}
28
29/// Convert to snake or kebab case, assuming camel or Pascal case.
30///
31/// If `s` is already in snake or kebab case, should yield the same result.
32pub fn snake_or_kebab_case(s: &str, is_snake_case: bool) -> String {
33    let mut result = String::new();
34    for ch in s.chars() {
35        if ch.is_ascii_uppercase() && !result.is_empty() {
36            if is_snake_case {
37                result.push('_');
38            } else {
39                result.push('-');
40            }
41        };
42
43        if ch == '_' || ch == '-' {
44            if is_snake_case {
45                result.push('_');
46            } else {
47                result.push('-');
48            }
49        } else {
50            result.push(ch.to_ascii_lowercase());
51        }
52    }
53    result
54}
55
56#[cfg(test)]
57mod tests {
58    use super::*;
59
60    #[test]
61    fn test_pascal_case() {
62        assert_eq!("FooBar", pascal_or_camel_case("foo_bar", true));
63        assert_eq!("FooBar", pascal_or_camel_case("fooBar", true));
64        assert_eq!("FooBar", pascal_or_camel_case("foo-bar", true));
65        assert_eq!("FooBar", pascal_or_camel_case("FooBar", true));
66    }
67
68    #[test]
69    fn test_camel_case() {
70        assert_eq!("fooBar", pascal_or_camel_case("foo_bar", false));
71        assert_eq!("fooBar", pascal_or_camel_case("fooBar", false));
72        assert_eq!("fooBar", pascal_or_camel_case("foo-bar", false));
73        assert_eq!("fooBar", pascal_or_camel_case("FooBar", false));
74    }
75
76    #[test]
77    fn test_snake_case() {
78        assert_eq!("foo_bar", snake_or_kebab_case("foo_bar", true));
79        assert_eq!("foo_bar", snake_or_kebab_case("fooBar", true));
80        assert_eq!("foo_bar", snake_or_kebab_case("foo-bar", true));
81        assert_eq!("foo_bar", snake_or_kebab_case("FooBar", true));
82    }
83
84    #[test]
85    fn test_kebab_case() {
86        assert_eq!("foo-bar", snake_or_kebab_case("foo_bar", false));
87        assert_eq!("foo-bar", snake_or_kebab_case("fooBar", false));
88        assert_eq!("foo-bar", snake_or_kebab_case("foo-bar", false));
89        assert_eq!("foo-bar", snake_or_kebab_case("FooBar", false));
90    }
91}