Skip to main content

radiate_utils/
fmt.rs

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}