Skip to main content

apple_code_assistant/utils/
languages.rs

1//! Supported languages and language detection
2
3/// Supported languages: (display name, aliases for CLI)
4pub const SUPPORTED_LANGUAGES: &[(&str, &[&str])] = &[
5    ("typescript", &["ts"]),
6    ("javascript", &["js"]),
7    ("python", &["py"]),
8    ("rust", &["rs"]),
9    ("go", &["golang"]),
10    ("java", &[]),
11    ("c", &[]),
12    ("cpp", &["c++"]),
13    ("csharp", &["c#", "cs"]),
14    ("swift", &[]),
15    ("kotlin", &["kt"]),
16    ("ruby", &["rb"]),
17    ("php", &[]),
18    ("html", &[]),
19    ("css", &[]),
20    ("sql", &[]),
21    ("shell", &["bash", "sh"]),
22    ("json", &[]),
23    ("yaml", &["yml"]),
24    ("markdown", &["md"]),
25];
26
27/// Return true if `lang` is a supported language or alias.
28pub fn is_supported(lang: &str) -> bool {
29    let lang = lang.to_lowercase();
30    for (name, aliases) in SUPPORTED_LANGUAGES {
31        if *name == lang {
32            return true;
33        }
34        if aliases.contains(&lang.as_str()) {
35            return true;
36        }
37    }
38    false
39}
40
41/// Normalize language (alias -> canonical name).
42pub fn normalize(lang: &str) -> Option<String> {
43    let lang = lang.to_lowercase();
44    for (name, aliases) in SUPPORTED_LANGUAGES {
45        if *name == lang {
46            return Some(name.to_string());
47        }
48        if aliases.contains(&lang.as_str()) {
49            return Some(name.to_string());
50        }
51    }
52    None
53}
54
55/// Suggest language from file extension (e.g. ".rs" -> "rust").
56pub fn from_extension(ext: &str) -> Option<String> {
57    let ext = ext.trim_start_matches('.').to_lowercase();
58    for (name, aliases) in SUPPORTED_LANGUAGES {
59        if *name == ext || aliases.contains(&ext.as_str()) {
60            return Some(name.to_string());
61        }
62    }
63    None
64}
65
66/// Suggest language from prompt (simple keyword heuristic).
67pub fn from_prompt(prompt: &str) -> Option<String> {
68    let p = prompt.to_lowercase();
69    let keywords = [
70        ("typescript", "typescript"),
71        ("python", "python"),
72        ("rust", "rust"),
73        ("react", "typescript"),
74        ("express", "javascript"),
75        ("django", "python"),
76        ("flask", "python"),
77    ];
78    for (keyword, lang) in keywords {
79        if p.contains(keyword) {
80            return Some(lang.to_string());
81        }
82    }
83    None
84}