fn to_acronym(word: &str) -> Option { if word.chars().all(|c| c.is_uppercase() || !c.is_alphabetic()) || word.chars().all(|c| c.is_lowercase() || !c.is_alphabetic()) { word.chars() .find(|c| c.is_alphabetic()) .map(|c| c.to_uppercase().to_string()) } else { Some(word.chars().filter(|c| c.is_uppercase()).collect()) } } pub fn abbreviate(phrase: &str) -> String { phrase .split(|c| " -:,".contains(c)) // Split into words .filter(|s| !s.is_empty()) .flat_map(to_acronym) .collect() }