pub(crate) fn sanitize_package_name(name: &str) -> String {
let mut clean_name = String::new();
let mut previous_was_separator = false;
if ch.is_ascii_alphanumeric() {
clean_name.push(ch.to_ascii_lowercase());
previous_was_separator = false;
} else if !previous_was_separator && !clean_name.is_empty() {
previous_was_separator = true;
while clean_name.ends_with('_') {
if clean_name.is_empty() {
clean_name.push_str("xtazy_project");
if clean_name.starts_with(|c: char| c.is_ascii_digit()) {
clean_name = format!("xtazy_{}", clean_name);
fn sanitizes_dash_and_leading_digit() {
assert_eq!(sanitize_package_name("my-app"), "my_app");
assert_eq!(sanitize_package_name("123-app"), "xtazy_123_app");
fn sanitizes_spaces_punctuation_and_empty_names() {
assert_eq!(sanitize_package_name("My App!"), "my_app");
assert_eq!(sanitize_package_name("hello.world"), "hello_world");
assert_eq!(sanitize_package_name("___"), "xtazy_project");