#![allow(dead_code)]
use std::path::Path;
pub struct CliHighlight {
pub highlight: fn(&str, &str) -> Option<String>,
pub supports_language: fn(&str) -> bool,
}
static mut LOADED_GET_LANGUAGE: Option<fn(&str) -> Option<String>> = None;
pub fn get_cli_highlight() -> Option<&'static CliHighlight> {
static HIGHLIGHT: std::sync::OnceLock<Option<CliHighlight>> = std::sync::OnceLock::new();
HIGHLIGHT
.get_or_init(|| {
None
})
.as_ref()
}
pub async fn get_language_name(file_path: &str) -> String {
let ext = Path::new(file_path)
.extension()
.and_then(|e| e.to_str())
.unwrap_or("");
if ext.is_empty() {
return "unknown".to_string();
}
match ext.to_lowercase().as_str() {
"js" | "jsx" | "mjs" | "cjs" => "JavaScript",
"ts" | "tsx" | "mts" | "cts" => "TypeScript",
"rs" => "Rust",
"py" | "pyw" => "Python",
"go" => "Go",
"java" => "Java",
"c" | "h" => "C",
"cpp" | "cc" | "cxx" | "hpp" | "hxx" => "C++",
"rb" => "Ruby",
"php" => "PHP",
"swift" => "Swift",
"kt" | "kts" => "Kotlin",
"scala" => "Scala",
"hs" => "Haskell",
"ml" | "mli" => "OCaml",
"cs" => "C#",
"fs" | "fsx" => "F#",
"vb" => "Visual Basic",
"html" | "htm" => "HTML",
"css" => "CSS",
"scss" => "SCSS",
"sass" => "Sass",
"less" => "Less",
"json" => "JSON",
"yaml" | "yml" => "YAML",
"toml" => "TOML",
"xml" => "XML",
"md" | "markdown" | "mdx" => "Markdown",
"sql" => "SQL",
"sh" | "bash" | "zsh" => "Bash",
"fish" => "Fish",
"ps1" => "PowerShell",
"dockerfile" => "Dockerfile",
"makefile" => "Makefile",
"lua" => "Lua",
"r" => "R",
"dart" => "Dart",
"ex" | "exs" => "Elixir",
"erl" | "hrl" => "Erlang",
"clj" | "cljs" => "Clojure",
"groovy" | "gvy" => "Groovy",
"perl" | "pl" | "pm" => "Perl",
"proto" => "Protocol Buffers",
"graphql" | "gql" => "GraphQL",
"diff" | "patch" => "Diff",
"ini" | "cfg" => "INI",
"csv" => "CSV",
"tf" | "hcl" => "HCL",
"vue" => "Vue",
"svelte" => "Svelte",
_ => "unknown",
}
.to_string()
}
#[cfg(test)]
mod tests {
use super::*;
#[tokio::test]
async fn test_get_language_name_typescript() {
assert_eq!(get_language_name("foo/bar.ts").await, "TypeScript");
}
#[tokio::test]
async fn test_get_language_name_rust() {
assert_eq!(get_language_name("src/main.rs").await, "Rust");
}
#[tokio::test]
async fn test_get_language_name_no_extension() {
assert_eq!(get_language_name("Makefile").await, "unknown");
}
#[tokio::test]
async fn test_get_language_name_empty_path() {
assert_eq!(get_language_name("").await, "unknown");
}
}