/// Turn a project name into a url-friendly slug: "My Cool App!" -> "my-cool-app". pub fn slugify(input: &str) -> String { let mut out = String::new(); let mut last_dash = true; // swallow leading separators for c in input.chars().flat_map(|c| c.to_lowercase()) { if c.is_ascii_alphanumeric() { out.push(c); last_dash = false; } else if !last_dash { out.push('-'); last_dash = true; } } while out.ends_with('-') { out.pop(); } if out.is_empty() { "project".into() } else { out } } #[cfg(test)] mod tests { use super::*; #[test] fn basics() { assert_eq!(slugify("My Cool App!"), "my-cool-app"); assert_eq!(slugify("a__b"), "a-b"); assert_eq!(slugify(" --__ "), "project"); assert_eq!(slugify("TODO-Tracker"), "todo-tracker"); } }