pub(crate) fn snake_to_pascal(s: &str) -> String {
let mut result = String::with_capacity(s.len());
let mut capitalize_next = true;
for ch in s.chars() {
if ch == '_' {
capitalize_next = true;
} else if ch.is_ascii_alphanumeric() {
if capitalize_next {
result.push(ch.to_ascii_uppercase());
capitalize_next = false;
} else {
result.push(ch.to_ascii_lowercase());
}
} else {
capitalize_next = true;
}
}
result
}
pub(crate) fn to_screaming_snake(s: &str) -> String {
let mut result =
String::with_capacity(s.len() + s.chars().filter(|c| c.is_uppercase()).count());
let mut prev_was_lower = false;
for ch in s.chars() {
if ch.is_uppercase() && prev_was_lower && !result.is_empty() {
result.push('_');
}
result.push(ch.to_ascii_uppercase());
prev_was_lower = ch.is_lowercase();
}
result
}