pub fn snake_case_to_camel_case(s: &str) -> String {
s.split('_') .map(|c| {
let mut c_mut = c.to_string(); make_ascii_titlecase(&mut c_mut);
c_mut
})
.collect::<String>()
}
fn make_ascii_titlecase(s: &mut str) {
if let Some(r) = s.get_mut(0..1) {
r.make_ascii_uppercase();
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_basic_conversion() {
assert_eq!(snake_case_to_camel_case("hello_world"), "HelloWorld");
}
#[test]
fn test_leading_underscore() {
assert_eq!(
snake_case_to_camel_case("_leading_underscore"),
"LeadingUnderscore"
);
}
#[test]
fn test_trailing_underscore() {
assert_eq!(
snake_case_to_camel_case("trailing_underscore_"),
"TrailingUnderscore"
);
}
#[test]
fn test_double_underscore() {
assert_eq!(
snake_case_to_camel_case("double__underscore"),
"DoubleUnderscore"
);
}
#[test]
fn test_empty_string() {
assert_eq!(snake_case_to_camel_case(""), "");
}
#[test]
fn test_single_word() {
assert_eq!(snake_case_to_camel_case("single"), "Single");
}
}