pub mod generator;
#[cfg(test)]
mod tests {
#[test]
fn test_project_name_patterns() {
assert!(is_valid_project_name("my-project"));
assert!(is_valid_project_name("my_project"));
assert!(is_valid_project_name("myproject123"));
assert!(!is_valid_project_name("My Project")); assert!(!is_valid_project_name("my-project!")); assert!(!is_valid_project_name("-leading-dash")); }
fn is_valid_project_name(name: &str) -> bool {
if name.is_empty() {
return false;
}
if name.starts_with('-') {
return false;
}
if name.contains(char::is_whitespace) {
return false;
}
for c in name.chars() {
if !c.is_alphanumeric() && c != '-' && c != '_' {
return false;
}
}
true
}
#[test]
fn test_version_format() {
assert!(is_valid_version("0.1.0"));
assert!(is_valid_version("1.0.0"));
assert!(is_valid_version("2.10.5"));
assert!(is_valid_version("0.0.1-alpha"));
assert!(!is_valid_version("invalid"));
assert!(!is_valid_version("v1.0.0")); assert!(!is_valid_version("1.0")); }
fn is_valid_version(version: &str) -> bool {
if version.is_empty() {
return false;
}
let parts: Vec<&str> = version.split('.').collect();
if parts.len() != 3 {
return false;
}
for part in parts {
if part.is_empty() {
return false;
}
let base = part.split('-').next().unwrap();
if base.chars().any(|c| !c.is_ascii_digit()) {
return false;
}
}
true
}
}