Skip to main content

semtree_core/
language.rs

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}