1pub fn to_snake_case(s: &str) -> String {
5 let mut result = String::new();
6
7 for c in s.chars() {
8 if c.is_uppercase() {
9 if !result.is_empty() {
10 result.push('_');
11 }
12 result.push(c.to_lowercase().next().unwrap());
13 } else {
14 result.push(c);
15 }
16 }
17
18 result
19}
20
21pub fn to_pascal_case(s: &str) -> String {
23 s.split('_')
24 .map(|word| {
25 let mut chars = word.chars();
26 match chars.next() {
27 None => String::new(),
28 Some(f) => f.to_uppercase().collect::<String>() + chars.as_str(),
29 }
30 })
31 .collect()
32}
33
34#[cfg(test)]
35mod tests {
36 use super::*;
37
38 #[test]
39 fn test_case_conversion() {
40 assert_eq!(to_snake_case("PoolState"), "pool_state");
41 assert_eq!(to_snake_case("LbPair"), "lb_pair");
42 assert_eq!(to_snake_case("initialize"), "initialize");
43 assert_eq!(to_snake_case("MyIDL"), "my_i_d_l");
44
45 assert_eq!(to_pascal_case("pool_state"), "PoolState");
46 assert_eq!(to_pascal_case("lb_pair"), "LbPair");
47 assert_eq!(to_pascal_case("initialize"), "Initialize");
48 }
49}