use std::path::Path;
use ast_grep_language::SupportLang;
struct Entry {
name: &'static str,
extensions: &'static [&'static str],
grammar: SupportLang,
}
pub(crate) const ALL: [&str; 28] = [
"bash",
"c",
"cpp",
"csharp",
"css",
"dart",
"elixir",
"go",
"haskell",
"hcl",
"html",
"java",
"javascript",
"json",
"kotlin",
"lua",
"markdown",
"nix",
"php",
"python",
"ruby",
"rust",
"scala",
"solidity",
"swift",
"tsx",
"typescript",
"yaml",
];
const TABLE: &[Entry] = &[
#[cfg(feature = "lang-bash")]
Entry {
name: "bash",
extensions: &["sh", "bash", "zsh"],
grammar: SupportLang::Bash,
},
#[cfg(feature = "lang-c")]
Entry {
name: "c",
extensions: &["c", "h"],
grammar: SupportLang::C,
},
#[cfg(feature = "lang-cpp")]
Entry {
name: "cpp",
extensions: &["cc", "cpp", "cxx", "hpp", "hxx"],
grammar: SupportLang::Cpp,
},
#[cfg(feature = "lang-csharp")]
Entry {
name: "csharp",
extensions: &["cs"],
grammar: SupportLang::CSharp,
},
#[cfg(feature = "lang-css")]
Entry {
name: "css",
extensions: &["css", "scss"],
grammar: SupportLang::Css,
},
#[cfg(feature = "lang-dart")]
Entry {
name: "dart",
extensions: &["dart"],
grammar: SupportLang::Dart,
},
#[cfg(feature = "lang-elixir")]
Entry {
name: "elixir",
extensions: &["ex", "exs"],
grammar: SupportLang::Elixir,
},
#[cfg(feature = "lang-go")]
Entry {
name: "go",
extensions: &["go"],
grammar: SupportLang::Go,
},
#[cfg(feature = "lang-haskell")]
Entry {
name: "haskell",
extensions: &["hs"],
grammar: SupportLang::Haskell,
},
#[cfg(feature = "lang-hcl")]
Entry {
name: "hcl",
extensions: &["hcl", "tf", "tfvars"],
grammar: SupportLang::Hcl,
},
#[cfg(feature = "lang-html")]
Entry {
name: "html",
extensions: &["html", "htm"],
grammar: SupportLang::Html,
},
#[cfg(feature = "lang-java")]
Entry {
name: "java",
extensions: &["java"],
grammar: SupportLang::Java,
},
#[cfg(feature = "lang-javascript")]
Entry {
name: "javascript",
extensions: &["js", "cjs", "mjs", "jsx"],
grammar: SupportLang::JavaScript,
},
#[cfg(feature = "lang-json")]
Entry {
name: "json",
extensions: &["json"],
grammar: SupportLang::Json,
},
#[cfg(feature = "lang-kotlin")]
Entry {
name: "kotlin",
extensions: &["kt", "kts"],
grammar: SupportLang::Kotlin,
},
#[cfg(feature = "lang-lua")]
Entry {
name: "lua",
extensions: &["lua"],
grammar: SupportLang::Lua,
},
#[cfg(feature = "lang-markdown")]
Entry {
name: "markdown",
extensions: &["md", "markdown"],
grammar: SupportLang::Markdown,
},
#[cfg(feature = "lang-nix")]
Entry {
name: "nix",
extensions: &["nix"],
grammar: SupportLang::Nix,
},
#[cfg(feature = "lang-php")]
Entry {
name: "php",
extensions: &["php"],
grammar: SupportLang::Php,
},
#[cfg(feature = "lang-python")]
Entry {
name: "python",
extensions: &["py", "pyi"],
grammar: SupportLang::Python,
},
#[cfg(feature = "lang-ruby")]
Entry {
name: "ruby",
extensions: &["rb"],
grammar: SupportLang::Ruby,
},
#[cfg(feature = "lang-rust")]
Entry {
name: "rust",
extensions: &["rs"],
grammar: SupportLang::Rust,
},
#[cfg(feature = "lang-scala")]
Entry {
name: "scala",
extensions: &["scala", "sc"],
grammar: SupportLang::Scala,
},
#[cfg(feature = "lang-solidity")]
Entry {
name: "solidity",
extensions: &["sol"],
grammar: SupportLang::Solidity,
},
#[cfg(feature = "lang-swift")]
Entry {
name: "swift",
extensions: &["swift"],
grammar: SupportLang::Swift,
},
#[cfg(feature = "lang-typescript")]
Entry {
name: "tsx",
extensions: &["tsx"],
grammar: SupportLang::Tsx,
},
#[cfg(feature = "lang-typescript")]
Entry {
name: "typescript",
extensions: &["ts", "mts", "cts"],
grammar: SupportLang::TypeScript,
},
#[cfg(feature = "lang-yaml")]
Entry {
name: "yaml",
extensions: &["yaml", "yml"],
grammar: SupportLang::Yaml,
},
];
pub(crate) fn by_name(name: &str) -> Option<SupportLang> {
TABLE
.iter()
.find(|entry| entry.name == name)
.map(|entry| entry.grammar)
}
pub(crate) fn by_extension(path: &Path) -> Option<SupportLang> {
let extension = path.extension()?.to_str()?;
TABLE
.iter()
.find(|entry| entry.extensions.contains(&extension))
.map(|entry| entry.grammar)
}
pub(crate) fn available() -> String {
let names: Vec<&str> = TABLE.iter().map(|entry| entry.name).collect();
if names.is_empty() {
return "(none — this mmz was built with no `lang-*` feature)".to_owned();
}
names.join(", ")
}
pub(crate) fn count() -> usize {
TABLE.len()
}
pub(crate) fn is_known(name: &str) -> bool {
ALL.contains(&name)
}
#[cfg(test)]
#[path = "ast_lang_tests.rs"]
mod tests;