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}