1#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
3pub enum Language {
4 Rust,
5 TypeScript,
6 Python,
7 JavaScript,
8 Markdown,
9 Json,
10 Yaml,
11 Toml,
12 Csv,
13}
14
15impl std::fmt::Display for Language {
16 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
17 match self {
18 Self::Rust => write!(f, "rust"),
19 Self::TypeScript => write!(f, "typescript"),
20 Self::Python => write!(f, "python"),
21 Self::JavaScript => write!(f, "javascript"),
22 Self::Markdown => write!(f, "markdown"),
23 Self::Json => write!(f, "json"),
24 Self::Yaml => write!(f, "yaml"),
25 Self::Toml => write!(f, "toml"),
26 Self::Csv => write!(f, "csv"),
27 }
28 }
29}
30
31impl Language {
32 pub fn from_extension(ext: &str) -> Option<Self> {
37 match ext {
38 "rs" => Some(Self::Rust),
39 "ts" => Some(Self::TypeScript),
40 "tsx" => Some(Self::TypeScript),
41 "js" => Some(Self::JavaScript),
42 "jsx" => Some(Self::JavaScript),
43 "py" => Some(Self::Python),
44 "md" => Some(Self::Markdown),
45 "json" => Some(Self::Json),
46 "yaml" | "yml" => Some(Self::Yaml),
47 "toml" => Some(Self::Toml),
48 "csv" => Some(Self::Csv),
49 _ => None,
50 }
51 }
52}
53
54#[cfg(test)]
55mod tests {
56 use super::*;
57
58 #[test]
59 fn known_extensions() {
60 assert_eq!(Language::from_extension("rs"), Some(Language::Rust));
61 assert_eq!(Language::from_extension("ts"), Some(Language::TypeScript));
62 assert_eq!(Language::from_extension("tsx"), Some(Language::TypeScript));
63 assert_eq!(Language::from_extension("js"), Some(Language::JavaScript));
64 assert_eq!(Language::from_extension("jsx"), Some(Language::JavaScript));
65 assert_eq!(Language::from_extension("py"), Some(Language::Python));
66 assert_eq!(Language::from_extension("md"), Some(Language::Markdown));
67 assert_eq!(Language::from_extension("json"), Some(Language::Json));
68 assert_eq!(Language::from_extension("yaml"), Some(Language::Yaml));
69 assert_eq!(Language::from_extension("yml"), Some(Language::Yaml));
70 assert_eq!(Language::from_extension("toml"), Some(Language::Toml));
71 assert_eq!(Language::from_extension("csv"), Some(Language::Csv));
72 }
73
74 #[test]
75 fn unknown_extension() {
76 assert_eq!(Language::from_extension("png"), None);
77 assert_eq!(Language::from_extension(""), None);
78 }
79}