Skip to main content

travsr_plugin_protocol/
language_map.rs

1use travsr_core::Language;
2
3/// Map a canonical proto language string to a Language variant.
4/// Case-sensitive. Returns None for unrecognised values.
5pub fn language_from_proto_str(s: &str) -> Option<Language> {
6    match s {
7        "typescript" | "javascript" => Some(Language::TypeScript),
8        "rust" => Some(Language::Rust),
9        "python" => Some(Language::Python),
10        "go" => Some(Language::Go),
11        "java" => Some(Language::Java),
12        "kotlin" => Some(Language::Kotlin),
13        "ruby" => Some(Language::Ruby),
14        "csharp" => Some(Language::CSharp),
15        "php" => Some(Language::Php),
16        "scala" => Some(Language::Scala),
17        "cpp" => Some(Language::Cpp),
18        "c" => Some(Language::C),
19        _ => None,
20    }
21}
22
23pub fn language_to_proto_str(lang: Language) -> &'static str {
24    lang.as_str()
25}
26
27#[cfg(test)]
28mod tests {
29    use super::*;
30    #[test]
31    fn known_languages_round_trip() {
32        for (s, expected) in [
33            ("typescript", Language::TypeScript),
34            ("javascript", Language::TypeScript),
35            ("rust", Language::Rust),
36            ("python", Language::Python),
37            ("go", Language::Go),
38            ("java", Language::Java),
39            ("kotlin", Language::Kotlin),
40            ("scala", Language::Scala),
41            ("cpp", Language::Cpp),
42            ("c", Language::C),
43        ] {
44            assert_eq!(language_from_proto_str(s), Some(expected), "failed for {s}");
45        }
46    }
47    #[test]
48    fn unknown_language_returns_none() {
49        assert_eq!(language_from_proto_str("TypeScript"), None); // case-sensitive
50        assert_eq!(language_from_proto_str("Kotlin"), None); // case-sensitive
51        assert_eq!(language_from_proto_str(""), None);
52    }
53}