pub fn generate_project_id(title: &str) -> String {
let words: Vec<&str> = title.split_whitespace().filter(|w| !w.is_empty()).collect();
let id = if words.len() >= 3 {
words.iter().take(3).filter_map(|w| w.chars().next()).collect::<String>()
} else if words.len() == 2 {
let mut chars: Vec<char> =
words.iter().filter_map(|w| w.chars().next()).collect();
let longer = if words[0].len() >= words[1].len() { words[0] } else { words[1] };
if let Some(c) = longer.chars().nth(1) {
chars.push(c);
}
chars.into_iter().collect()
} else if words.len() == 1 {
words[0].chars().take(3).collect()
} else {
"XXX".to_string()
};
id.to_uppercase()
}
pub fn generate_task_id(project_id: &str, counter: u32) -> String {
format!("{}-{:03}", project_id, counter)
}
pub fn parse_task_id(task_id: &str) -> Option<(String, u32)> {
let parts: Vec<&str> = task_id.splitn(2, '-').collect();
if parts.len() != 2 {
return None;
}
let project_id = parts[0].to_string();
let counter = parts[1].parse::<u32>().ok()?;
Some((project_id, counter))
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_project_id_multiple_words() {
assert_eq!(generate_project_id("My Cool Project"), "MCP");
assert_eq!(generate_project_id("Knowledge Base System"), "KBS");
}
#[test]
fn test_project_id_two_words() {
assert_eq!(generate_project_id("Home Automation"), "HAU");
assert_eq!(generate_project_id("AI Research"), "ARE");
}
#[test]
fn test_project_id_single_word() {
assert_eq!(generate_project_id("Inventory"), "INV");
assert_eq!(generate_project_id("AI"), "AI");
assert_eq!(generate_project_id("X"), "X");
}
#[test]
fn test_project_id_empty() {
assert_eq!(generate_project_id(""), "XXX");
assert_eq!(generate_project_id(" "), "XXX");
}
#[test]
fn test_project_id_lowercase() {
assert_eq!(generate_project_id("my cool project"), "MCP");
}
#[test]
fn test_task_id_generation() {
assert_eq!(generate_task_id("MCP", 1), "MCP-001");
assert_eq!(generate_task_id("MCP", 42), "MCP-042");
assert_eq!(generate_task_id("MCP", 999), "MCP-999");
}
#[test]
fn test_parse_task_id() {
assert_eq!(parse_task_id("MCP-001"), Some(("MCP".to_string(), 1)));
assert_eq!(parse_task_id("INV-042"), Some(("INV".to_string(), 42)));
assert_eq!(parse_task_id("invalid"), None);
assert_eq!(parse_task_id("MCP-abc"), None);
}
}