Converts a camelCase or PascalCase string to snake_case.
(name: &str)
| 109 | |
| 110 | /// Converts a camelCase or PascalCase string to snake_case. |
| 111 | pub fn to_snake_case(name: &str) -> String { |
| 112 | let mut result = String::with_capacity(name.len() + 4); |
| 113 | let chars: Vec<char> = name.chars().collect(); |
| 114 | |
| 115 | for (i, &c) in chars.iter().enumerate() { |
| 116 | if c.is_ascii_uppercase() { |
| 117 | if i > 0 { |
| 118 | let prev_upper = chars.get(i - 1).is_some_and(|c| c.is_ascii_uppercase()); |
| 119 | let next_upper_or_end = chars.get(i + 1).map_or(true, |c| c.is_ascii_uppercase()); |
| 120 | if !prev_upper || !next_upper_or_end { |
| 121 | result.push('_'); |
| 122 | } |
| 123 | } |
| 124 | result.push(c.to_ascii_lowercase()); |
| 125 | } else { |
| 126 | result.push(c); |
| 127 | } |
| 128 | } |
| 129 | result |
| 130 | } |
| 131 | |
| 132 | /// Converts a snake_case string to lowerCamelCase. |
| 133 | pub fn to_camel_case(name: &str) -> String { |
no test coverage detected