1use serde::{Deserialize, Serialize};
2use std::fmt;
3
4#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
5#[serde(rename_all = "lowercase")]
6pub enum Language {
7 Rust,
8 Python,
9 JavaScript,
10 TypeScript,
11 Tsx,
12 Go,
13 Java,
14 C,
15 Cpp,
16 CSharp,
17 Ruby,
18 Php,
19 Kotlin,
20 Scala,
21 Swift,
22 OCaml,
23 Solidity,
24 Lua,
25 Zig,
26 Elisp,
27 Unknown,
28}
29
30impl Language {
31 pub fn from_extension(ext: &str) -> Self {
32 match ext {
33 "rs" => Self::Rust,
34 "py" => Self::Python,
35 "js" | "mjs" | "cjs" | "jsx" => Self::JavaScript,
36 "ts" => Self::TypeScript,
37 "tsx" => Self::Tsx,
38 "go" => Self::Go,
39 "java" => Self::Java,
40 "c" | "h" => Self::C,
41 "cpp" | "cc" | "cxx" | "hpp" | "hh" | "hxx" => Self::Cpp,
42 "cs" => Self::CSharp,
43 "rb" => Self::Ruby,
44 "php" => Self::Php,
45 "kt" | "kts" => Self::Kotlin,
46 "scala" | "sc" => Self::Scala,
47 "swift" => Self::Swift,
48 "ml" | "mli" => Self::OCaml,
49 "sol" => Self::Solidity,
50 "lua" => Self::Lua,
51 "zig" => Self::Zig,
52 "el" => Self::Elisp,
53 _ => Self::Unknown,
54 }
55 }
56
57 pub fn from_path(path: &std::path::Path) -> Self {
58 path.extension()
59 .and_then(|e| e.to_str())
60 .map(Self::from_extension)
61 .unwrap_or(Self::Unknown)
62 }
63}
64
65impl fmt::Display for Language {
66 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
67 let s = match self {
68 Self::Rust => "rust",
69 Self::Python => "python",
70 Self::JavaScript => "javascript",
71 Self::TypeScript => "typescript",
72 Self::Tsx => "tsx",
73 Self::Go => "go",
74 Self::Java => "java",
75 Self::C => "c",
76 Self::Cpp => "cpp",
77 Self::CSharp => "csharp",
78 Self::Ruby => "ruby",
79 Self::Php => "php",
80 Self::Kotlin => "kotlin",
81 Self::Scala => "scala",
82 Self::Swift => "swift",
83 Self::OCaml => "ocaml",
84 Self::Solidity => "solidity",
85 Self::Lua => "lua",
86 Self::Zig => "zig",
87 Self::Elisp => "elisp",
88 Self::Unknown => "unknown",
89 };
90 write!(f, "{s}")
91 }
92}