Skip to main content

mproto_codegen/codegen/
name_util.rs

1pub 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                // Start of caps word
14                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}