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. |
6 | pub fn pascal_or_camel_case(s: &str, is_pascal_case: bool) -> String { |
7 | let mut result: String = String::new(); |
8 | let mut capitalize: bool = is_pascal_case; |
9 | let mut first: bool = true; |
10 | for ch: char 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. |
32 | pub fn snake_or_kebab_case(s: &str, is_snake_case: bool) -> String { |
33 | let mut result: String = String::new(); |
34 | for ch: char in s.chars() { |
35 | if ch.is_ascii_uppercase() && !result.is_empty() { |
36 | if is_snake_case { |
37 | result.push(ch:'_' ); |
38 | } else { |
39 | result.push(ch:'-' ); |
40 | } |
41 | }; |
42 | |
43 | if ch == '_' || ch == '-' { |
44 | if is_snake_case { |
45 | result.push(ch:'_' ); |
46 | } else { |
47 | result.push(ch:'-' ); |
48 | } |
49 | } else { |
50 | result.push(ch.to_ascii_lowercase()); |
51 | } |
52 | } |
53 | result |
54 | } |
55 | |
56 | #[cfg (test)] |
57 | mod 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 | } |
92 | |