1use std::collections::HashMap;
2use std::sync::LazyLock;
3
4static ALIASES: LazyLock<HashMap<&'static str, &'static str>> = LazyLock::new(|| {
5 HashMap::from([
6 ("js", "javascript"),
7 ("ts", "typescript"),
8 ("py", "python"),
9 ("rb", "ruby"),
10 ("cs", "csharp"),
11 ])
12});
13
14static DISPLAY: LazyLock<HashMap<&'static str, &'static str>> = LazyLock::new(|| {
15 HashMap::from([
16 ("javascript", "js"),
17 ("typescript", "ts"),
18 ("python", "py"),
19 ("ruby", "rb"),
20 ("csharp", "cs"),
21 ])
22});
23
24pub fn normalize_language(lang: &str) -> String {
26 let lower = lang.to_lowercase();
27 ALIASES
28 .get(lower.as_str())
29 .map(|s| s.to_string())
30 .unwrap_or(lower)
31}
32
33pub fn display_language(lang: &str) -> &str {
35 DISPLAY.get(lang).copied().unwrap_or(lang)
36}
37
38#[cfg(test)]
39mod tests {
40 use super::*;
41
42 #[test]
43 fn test_normalize_aliases() {
44 assert_eq!(normalize_language("py"), "python");
45 assert_eq!(normalize_language("js"), "javascript");
46 assert_eq!(normalize_language("ts"), "typescript");
47 assert_eq!(normalize_language("rb"), "ruby");
48 assert_eq!(normalize_language("cs"), "csharp");
49 }
50
51 #[test]
52 fn test_normalize_case_insensitive() {
53 assert_eq!(normalize_language("PY"), "python");
54 assert_eq!(normalize_language("JavaScript"), "javascript");
55 }
56
57 #[test]
58 fn test_normalize_unknown() {
59 assert_eq!(normalize_language("rust"), "rust");
60 assert_eq!(normalize_language("go"), "go");
61 }
62
63 #[test]
64 fn test_display_language() {
65 assert_eq!(display_language("javascript"), "js");
66 assert_eq!(display_language("typescript"), "ts");
67 assert_eq!(display_language("python"), "py");
68 assert_eq!(display_language("ruby"), "rb");
69 assert_eq!(display_language("csharp"), "cs");
70 assert_eq!(display_language("rust"), "rust");
71 }
72}