1pub fn language_from_extension(extension: &str) -> &str {
7 match extension.to_lowercase().as_str() {
8 "rs" => "rust",
9 "py" => "python",
10 "js" => "javascript",
11 "ts" => "typescript",
12 "jsx" => "jsx",
13 "tsx" => "tsx",
14 "rb" => "ruby",
15 "go" => "go",
16 "java" => "java",
17 "kt" | "kts" => "kotlin",
18 "c" => "c",
19 "h" => "c",
20 "cpp" | "cc" | "cxx" => "cpp",
21 "hpp" | "hxx" => "cpp",
22 "cs" => "csharp",
23 "swift" => "swift",
24 "php" => "php",
25 "scala" => "scala",
26 "sh" | "bash" | "zsh" | "fish" => "bash",
27 "ps1" => "powershell",
28 "html" | "htm" => "html",
29 "css" => "css",
30 "scss" => "scss",
31 "sass" => "sass",
32 "less" => "less",
33 "json" => "json",
34 "yaml" | "yml" => "yaml",
35 "toml" => "toml",
36 "xml" => "xml",
37 "sql" => "sql",
38 "md" | "markdown" => "markdown",
39 "dockerfile" => "dockerfile",
40 "lua" => "lua",
41 "r" => "r",
42 "dart" => "dart",
43 "zig" => "zig",
44 "nim" => "nim",
45 "ex" | "exs" => "elixir",
46 "erl" | "hrl" => "erlang",
47 "hs" => "haskell",
48 "ml" | "mli" => "ocaml",
49 "clj" | "cljs" => "clojure",
50 "tf" => "hcl",
51 "vue" => "vue",
52 "svelte" => "svelte",
53 "graphql" | "gql" => "graphql",
54 "proto" => "protobuf",
55 "makefile" | "mk" => "makefile",
56 _ => extension,
57 }
58}
59
60#[cfg(test)]
61mod tests {
62 use super::*;
63
64 #[test]
65 fn known_extensions() {
66 assert_eq!(language_from_extension("rs"), "rust");
67 assert_eq!(language_from_extension("py"), "python");
68 assert_eq!(language_from_extension("js"), "javascript");
69 assert_eq!(language_from_extension("ts"), "typescript");
70 assert_eq!(language_from_extension("go"), "go");
71 assert_eq!(language_from_extension("java"), "java");
72 assert_eq!(language_from_extension("cpp"), "cpp");
73 assert_eq!(language_from_extension("cc"), "cpp");
74 assert_eq!(language_from_extension("c"), "c");
75 assert_eq!(language_from_extension("h"), "c");
76 assert_eq!(language_from_extension("hpp"), "cpp");
77 assert_eq!(language_from_extension("cs"), "csharp");
78 assert_eq!(language_from_extension("rb"), "ruby");
79 assert_eq!(language_from_extension("kt"), "kotlin");
80 assert_eq!(language_from_extension("kts"), "kotlin");
81 assert_eq!(language_from_extension("sh"), "bash");
82 assert_eq!(language_from_extension("bash"), "bash");
83 assert_eq!(language_from_extension("zsh"), "bash");
84 assert_eq!(language_from_extension("fish"), "bash");
85 assert_eq!(language_from_extension("yaml"), "yaml");
86 assert_eq!(language_from_extension("yml"), "yaml");
87 assert_eq!(language_from_extension("json"), "json");
88 assert_eq!(language_from_extension("toml"), "toml");
89 assert_eq!(language_from_extension("md"), "markdown");
90 assert_eq!(language_from_extension("ex"), "elixir");
91 assert_eq!(language_from_extension("exs"), "elixir");
92 assert_eq!(language_from_extension("hs"), "haskell");
93 assert_eq!(language_from_extension("tf"), "hcl");
94 assert_eq!(language_from_extension("vue"), "vue");
95 assert_eq!(language_from_extension("svelte"), "svelte");
96 assert_eq!(language_from_extension("proto"), "protobuf");
97 assert_eq!(language_from_extension("graphql"), "graphql");
98 assert_eq!(language_from_extension("gql"), "graphql");
99 }
100
101 #[test]
102 fn case_insensitive() {
103 assert_eq!(language_from_extension("RS"), "rust");
104 assert_eq!(language_from_extension("Py"), "python");
105 assert_eq!(language_from_extension("JS"), "javascript");
106 }
107
108 #[test]
109 fn unknown_extension_returns_as_is() {
110 assert_eq!(language_from_extension("xyz"), "xyz");
111 assert_eq!(language_from_extension("foo"), "foo");
112 }
113
114 #[test]
115 fn extensionless_filenames() {
116 assert_eq!(language_from_extension("Dockerfile"), "dockerfile");
117 assert_eq!(language_from_extension("dockerfile"), "dockerfile");
118 assert_eq!(language_from_extension("Makefile"), "makefile");
119 assert_eq!(language_from_extension("makefile"), "makefile");
120 }
121}