qlty_analysis/
utils.rs

1use anyhow::{anyhow, bail, Result};
2use std::path::PathBuf;
3
4pub mod fs;
5
6pub fn filename_to_language(filename: &str) -> Result<String> {
7    if filename.starts_with("Dockerfile") {
8        return Ok("dockerfile".to_string());
9    }
10
11    let path_buf = PathBuf::from(filename);
12    let file_extension = path_buf
13        .extension()
14        .ok_or_else(|| anyhow!("Failed to get file extension"))?
15        .to_str()
16        .ok_or_else(|| anyhow!("Failed to convert file extension to string"))?;
17
18    match file_extension {
19        "rs" => Ok("rust".to_string()),
20        "rb" => Ok("ruby".to_string()),
21        "sh" => Ok("shell".to_string()),
22        "py" => Ok("python".to_string()),
23        "php" => Ok("php".to_string()),
24        "css" => Ok("css".to_string()),
25        "js" => Ok("javascript".to_string()),
26        "mjs" => Ok("javascript".to_string()),
27        "cjs" => Ok("javascript".to_string()),
28        "jsx" => Ok("javascript".to_string()),
29        "ts" => Ok("typescript".to_string()),
30        "mts" => Ok("typescript".to_string()),
31        "cts" => Ok("typescript".to_string()),
32        "tsx" => Ok("typescript".to_string()),
33        "mtsx" => Ok("typescript".to_string()),
34        "ctsx" => Ok("typescript".to_string()),
35        "go" => Ok("go".to_string()),
36        "java" => Ok("java".to_string()),
37        _ => bail!("Unsupported file extension: {}", file_extension),
38    }
39}
40
41#[cfg(test)]
42mod test {
43    use super::*;
44
45    #[test]
46    fn test_filename_to_language() {
47        assert_eq!(filename_to_language("Dockerfile").unwrap(), "dockerfile");
48    }
49
50    #[test]
51    fn test_extension_to_language() {
52        assert_eq!(filename_to_language("main.rs").unwrap(), "rust");
53        assert_eq!(filename_to_language("main.rb").unwrap(), "ruby");
54        assert_eq!(filename_to_language("main.sh").unwrap(), "shell");
55        assert_eq!(filename_to_language("main.py").unwrap(), "python");
56        assert_eq!(filename_to_language("main.css").unwrap(), "css");
57        assert_eq!(filename_to_language("main.js").unwrap(), "javascript");
58        assert_eq!(filename_to_language("main.mjs").unwrap(), "javascript");
59        assert_eq!(filename_to_language("main.cjs").unwrap(), "javascript");
60        assert_eq!(filename_to_language("main.jsx").unwrap(), "javascript");
61        assert_eq!(filename_to_language("main.ts").unwrap(), "typescript");
62        assert_eq!(filename_to_language("main.mts").unwrap(), "typescript");
63        assert_eq!(filename_to_language("main.cts").unwrap(), "typescript");
64        assert_eq!(filename_to_language("main.tsx").unwrap(), "typescript");
65        assert_eq!(filename_to_language("main.mtsx").unwrap(), "typescript");
66        assert_eq!(filename_to_language("main.ctsx").unwrap(), "typescript");
67        assert_eq!(filename_to_language("main.go").unwrap(), "go");
68        assert_eq!(filename_to_language("main.java").unwrap(), "java");
69        assert!(filename_to_language("main").is_err());
70    }
71
72    #[test]
73    fn test_unknown_file() {
74        assert!(filename_to_language("main").is_err());
75    }
76}