1pub fn ticket_id(n: u64) -> String {
9 format!("T-{n}")
10}
11
12pub fn comment_id(n: u64) -> String {
14 format!("c-{n}")
15}
16
17pub fn slug(name: &str) -> String {
22 let mut out = String::with_capacity(name.len());
23 let mut prev_dash = false;
24 for ch in name.chars() {
25 if ch.is_ascii_alphanumeric() {
26 out.push(ch.to_ascii_lowercase());
27 prev_dash = false;
28 } else if !prev_dash {
29 out.push('-');
30 prev_dash = true;
31 }
32 }
33 let trimmed = out.trim_matches('-');
34 if trimmed.is_empty() {
35 "list".to_string()
36 } else {
37 trimmed.to_string()
38 }
39}
40
41#[cfg(test)]
42mod tests {
43 use super::*;
44
45 #[test]
46 fn formats_ids() {
47 assert_eq!(ticket_id(23), "T-23");
48 assert_eq!(comment_id(7), "c-7");
49 }
50
51 #[test]
52 fn slugs_names() {
53 assert_eq!(slug("In Progress"), "in-progress");
54 assert_eq!(slug(" To-Do!! "), "to-do");
55 assert_eq!(slug("Backlog"), "backlog");
56 assert_eq!(slug("***"), "list");
57 }
58}