pub fn pluralize(value: &str) -> String {
if value.ends_with("address") {
return format!("{value}es");
}
if let Some(stripped) = value.strip_suffix('y') {
if !stripped.ends_with(['a', 'e', 'i', 'o', 'u']) {
return format!("{stripped}ies");
}
}
if value.ends_with('s')
|| value.ends_with('x')
|| value.ends_with('z')
|| value.ends_with("ch")
|| value.ends_with("sh")
{
return format!("{value}es");
}
format!("{value}s")
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn pluralize_covers_every_branch() {
assert_eq!(pluralize("prefix"), "prefixes");
assert_eq!(pluralize("box"), "boxes");
assert_eq!(pluralize("buzz"), "buzzes");
assert_eq!(pluralize("branch"), "branches");
assert_eq!(pluralize("dish"), "dishes");
assert_eq!(pluralize("city"), "cities");
assert_eq!(pluralize("gateway"), "gateways");
assert_eq!(pluralize("bay"), "bays");
assert_eq!(pluralize("address"), "addresses");
assert_eq!(pluralize("ip-address"), "ip-addresses");
assert_eq!(pluralize("status"), "statuses");
assert_eq!(pluralize("device"), "devices");
assert_eq!(pluralize("device-bay"), "device-bays");
}
}