mproto_codegen/codegen/
name_util.rs1pub fn camel_to_snake_case(s: &str) -> String {
2 if s.len() == 0 {
3 return String::new();
4 }
5
6 let mut result = String::new();
7 let mut is_caps_word = false;
8 let mut do_not_underscore = true;
9
10 for (i, c) in s.chars().enumerate() {
11 if c.is_uppercase() {
12 if !is_caps_word {
13 if !do_not_underscore {
15 result.push('_');
16 }
17 result.push(c.to_lowercase().next().unwrap());
18 is_caps_word = true;
19 } else {
20 match s.chars().nth(i + 1) {
21 Some(next_c) if next_c.is_lowercase() => {
22 if !do_not_underscore {
23 result.push('_');
24 }
25 result.push(c.to_lowercase().next().unwrap());
26 }
27 _ => {
28 result.push(c.to_lowercase().next().unwrap());
29 }
30 }
31 }
32 } else {
33 result.push(c);
34 is_caps_word = false;
35 }
36
37 do_not_underscore = c == '_';
38 }
39
40 result
41}
42
43pub fn camel_to_kebab_case(s: &str) -> String {
44 camel_to_snake_case(s).replace("_", "-")
45}
46
47fn _snake_to_camel_case(s: &str, start_upper: bool) -> String {
48 if s.len() == 0 {
49 return String::new();
50 }
51
52 let mut result = String::new();
53 let mut make_next_char_upper = start_upper;
54
55 for c in s.chars() {
56 if c == '_' {
57 make_next_char_upper = true;
58 } else if make_next_char_upper {
59 make_next_char_upper = false;
60 result.push(c.to_uppercase().next().unwrap());
61 } else {
62 make_next_char_upper = false;
63 result.push(c);
64 }
65 }
66
67 result
68}
69
70pub fn snake_to_camel_case(s: &str) -> String {
71 _snake_to_camel_case(s, false)
72}
73
74pub fn snake_to_upper_camel_case(s: &str) -> String {
75 _snake_to_camel_case(s, true)
76}