1use crate::intern;
2
3#[inline]
4pub fn intern_name_as_snake_case(name: &'static str) -> &'static str {
5 crate::intern_snake_case!(name)
6}
7
8#[inline]
9pub fn intern_kv_pair(name: &'static str, value: &'static str) -> &'static str {
10 crate::intern_str_cache!(name, value)
11}
12
13pub trait ToSnakeCase<O> {
14 fn to_snake_case(&self) -> O;
15}
16
17impl ToSnakeCase<String> for &'_ str {
18 fn to_snake_case(&self) -> String {
19 if self
20 .chars()
21 .all(|c| c.is_uppercase() || c.is_digit(10) || c == '_')
22 {
23 return self.to_string();
24 }
25
26 let mut snake_case = String::new();
27
28 for (i, c) in self.chars().enumerate() {
29 if c.is_uppercase() {
30 if i != 0 {
31 snake_case.push('_');
32 }
33 for lower_c in c.to_lowercase() {
34 snake_case.push(lower_c);
35 }
36 } else {
37 snake_case.push(c);
38 }
39 }
40 snake_case
41 }
42}
43
44impl ToSnakeCase<String> for String {
45 fn to_snake_case(&self) -> String {
46 if self
47 .chars()
48 .all(|c| c.is_uppercase() || c.is_digit(10) || c == '_')
49 {
50 return self.to_string();
51 }
52
53 let mut snake_case = String::new();
54
55 for (i, c) in self.chars().enumerate() {
56 if c.is_uppercase() {
57 if i != 0 {
58 snake_case.push('_');
59 }
60 for lower_c in c.to_lowercase() {
61 snake_case.push(lower_c);
62 }
63 } else {
64 snake_case.push(c);
65 }
66 }
67 snake_case
68 }
69}