pub struct Language {
pub name: &'static str,
pub extensions: &'static [&'static str],
pub aliases: &'static [&'static str],
}
pub const LANGUAGES: &[Language] = &[
Language {
name: "rust",
extensions: &["rs"],
aliases: &["rs"],
},
Language {
name: "c",
extensions: &["c", "h"],
aliases: &[],
},
Language {
name: "cpp",
extensions: &["cpp", "cc", "cxx", "hpp", "hh"],
aliases: &["c++"],
},
Language {
name: "python",
extensions: &["py", "pyi"],
aliases: &["py"],
},
Language {
name: "go",
extensions: &["go"],
aliases: &["golang"],
},
Language {
name: "javascript",
extensions: &["js", "jsx", "mjs", "cjs"],
aliases: &["js"],
},
Language {
name: "typescript",
extensions: &["ts", "tsx"],
aliases: &["ts"],
},
Language {
name: "json",
extensions: &["json"],
aliases: &[],
},
Language {
name: "shellscript",
extensions: &["sh", "bash"],
aliases: &["sh", "bash", "shell"],
},
];
pub fn language_for_extension_name(ext: &str) -> Option<&'static str> {
LANGUAGES
.iter()
.find(|language| language.extensions.contains(&ext))
.map(|language| language.name)
}
pub fn language_for_extension(ext_with_dot: &str) -> Option<&'static str> {
language_for_extension_name(ext_with_dot.strip_prefix('.')?)
}
pub fn extensions_for_language(name_or_alias: &str) -> Option<&'static [&'static str]> {
LANGUAGES
.iter()
.find(|language| {
language.name == name_or_alias || language.aliases.contains(&name_or_alias)
})
.map(|language| language.extensions)
}
pub fn language_names() -> impl Iterator<Item = &'static str> {
LANGUAGES.iter().map(|language| language.name)
}