1pub struct Language {
8 pub name: &'static str,
9 pub extensions: &'static [&'static str],
10 pub aliases: &'static [&'static str],
11}
12
13pub const LANGUAGES: &[Language] = &[
14 Language {
15 name: "rust",
16 extensions: &["rs"],
17 aliases: &["rs"],
18 },
19 Language {
20 name: "c",
21 extensions: &["c", "h"],
22 aliases: &[],
23 },
24 Language {
25 name: "cpp",
26 extensions: &["cpp", "cc", "cxx", "hpp", "hh"],
27 aliases: &["c++"],
28 },
29 Language {
30 name: "python",
31 extensions: &["py", "pyi"],
32 aliases: &["py"],
33 },
34 Language {
35 name: "go",
36 extensions: &["go"],
37 aliases: &["golang"],
38 },
39 Language {
40 name: "javascript",
41 extensions: &["js", "jsx", "mjs", "cjs"],
42 aliases: &["js"],
43 },
44 Language {
45 name: "typescript",
46 extensions: &["ts", "tsx"],
47 aliases: &["ts"],
48 },
49 Language {
50 name: "json",
51 extensions: &["json"],
52 aliases: &[],
53 },
54 Language {
55 name: "shellscript",
56 extensions: &["sh", "bash"],
57 aliases: &["sh", "bash", "shell"],
58 },
59];
60
61pub fn language_for_extension_name(ext: &str) -> Option<&'static str> {
63 LANGUAGES
64 .iter()
65 .find(|language| language.extensions.contains(&ext))
66 .map(|language| language.name)
67}
68
69pub fn language_for_extension(ext_with_dot: &str) -> Option<&'static str> {
71 language_for_extension_name(ext_with_dot.strip_prefix('.')?)
72}
73
74pub fn extensions_for_language(name_or_alias: &str) -> Option<&'static [&'static str]> {
76 LANGUAGES
77 .iter()
78 .find(|language| {
79 language.name == name_or_alias || language.aliases.contains(&name_or_alias)
80 })
81 .map(|language| language.extensions)
82}
83
84pub fn language_names() -> impl Iterator<Item = &'static str> {
86 LANGUAGES.iter().map(|language| language.name)
87}