Skip to main content

argyph_fs/
language.rs

1/// Language detected from a file extension.
2#[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    /// Detect language from a file extension (without the leading dot).
33    ///
34    /// Matching is case-sensitive and lowercased. Returns `None` for
35    /// unrecognized extensions.
36    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}