1pub(crate) fn sanitize_package_name(name: &str) -> String {
2 let mut clean_name = String::new();
3 let mut previous_was_separator = false;
4 for ch in name.chars() {
5 if ch.is_ascii_alphanumeric() {
6 clean_name.push(ch.to_ascii_lowercase());
7 previous_was_separator = false;
8 } else if !previous_was_separator && !clean_name.is_empty() {
9 clean_name.push('_');
10 previous_was_separator = true;
11 }
12 }
13 while clean_name.ends_with('_') {
14 clean_name.pop();
15 }
16 if clean_name.is_empty() {
17 clean_name.push_str("xtazy_project");
18 }
19 if clean_name.starts_with(|c: char| c.is_ascii_digit()) {
20 clean_name = format!("xtazy_{}", clean_name);
21 }
22 clean_name
23}
24
25#[cfg(test)]
26mod tests {
27 use super::*;
28
29 #[test]
30 fn sanitizes_dash_and_leading_digit() {
31 assert_eq!(sanitize_package_name("my-app"), "my_app");
32 assert_eq!(sanitize_package_name("123-app"), "xtazy_123_app");
33 }
34
35 #[test]
36 fn sanitizes_spaces_punctuation_and_empty_names() {
37 assert_eq!(sanitize_package_name("My App!"), "my_app");
38 assert_eq!(sanitize_package_name("hello.world"), "hello_world");
39 assert_eq!(sanitize_package_name("___"), "xtazy_project");
40 }
41}