Skip to main content

dealer/
names.rs

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}