pub fn to_snake_case(s: &str) -> String {
let mut result = String::new();
for (i, c) in s.chars().enumerate() {
if c.is_uppercase() {
if i > 0 {
result.push('_');
}
result.push(c.to_lowercase().next().unwrap());
} else {
result.push(c);
}
}
result
}
pub fn to_pascal_case(s: &str) -> String {
let mut result = String::new();
let mut capitalize_next = true;
for c in s.chars() {
if c == '_' {
capitalize_next = true;
} else if capitalize_next {
result.push(c.to_uppercase().next().unwrap());
capitalize_next = false;
} else {
result.push(c);
}
}
result
}
pub fn pluralize(s: &str) -> String {
if s.ends_with('s') || s.ends_with('x') || s.ends_with("ch") || s.ends_with("sh") {
format!("{}es", s)
} else if s.ends_with('y') && !s.ends_with("ay") && !s.ends_with("ey") && !s.ends_with("oy") && !s.ends_with("uy") {
format!("{}ies", &s[..s.len()-1])
} else {
format!("{}s", s)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_to_snake_case() {
assert_eq!(to_snake_case("UserId"), "user_id");
assert_eq!(to_snake_case("authorId"), "author_id");
assert_eq!(to_snake_case("ID"), "i_d");
}
#[test]
fn test_to_pascal_case() {
assert_eq!(to_pascal_case("user_id"), "UserId");
assert_eq!(to_pascal_case("author_id"), "AuthorId");
}
#[test]
fn test_pluralize() {
assert_eq!(pluralize("User"), "Users");
assert_eq!(pluralize("Post"), "Posts");
assert_eq!(pluralize("Category"), "Categories");
}
}