Skip to main content

chub_core/
normalize.rs

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
24/// Normalize a language name: resolve aliases (js→javascript, etc.) and lowercase.
25pub 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
33/// Get the short display form of a language name (javascript→js, etc.).
34pub 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}