open_kioku_languages/
lib.rs1use open_kioku_core::Language;
2use std::path::Path;
3
4pub fn detect_language(path: &Path) -> Language {
5 match path
6 .extension()
7 .and_then(|ext| ext.to_str())
8 .unwrap_or_default()
9 {
10 "rs" => Language::Rust,
11 "java" => Language::Java,
12 "ts" | "tsx" => Language::TypeScript,
13 "js" | "jsx" | "mjs" | "cjs" => Language::JavaScript,
14 "py" => Language::Python,
15 "go" => Language::Go,
16 "yaml" | "yml" => Language::Yaml,
17 "json" => Language::Json,
18 "toml" => Language::Toml,
19 "sql" => Language::Sql,
20 "md" | "mdx" => Language::Markdown,
21 "txt" => Language::Text,
22 _ => Language::Unknown,
23 }
24}
25
26pub fn is_supported_code(language: &Language) -> bool {
27 matches!(
28 language,
29 Language::Rust
30 | Language::Java
31 | Language::TypeScript
32 | Language::JavaScript
33 | Language::Python
34 | Language::Go
35 | Language::Yaml
36 | Language::Json
37 | Language::Toml
38 | Language::Sql
39 | Language::Markdown
40 )
41}
42
43pub fn likely_test_path(path: &Path) -> bool {
44 let value = path.to_string_lossy().to_ascii_lowercase();
45 value.contains("/test/")
46 || value.contains("/tests/")
47 || value.ends_with("_test.rs")
48 || value.ends_with("_test.go")
49 || value.ends_with("test.java")
50 || value.ends_with(".spec.ts")
51 || value.ends_with(".test.ts")
52 || value.ends_with("_test.py")
53 || value.starts_with("tests/")
54}
55
56pub fn likely_vendor_path(path: &Path) -> bool {
57 let value = path.to_string_lossy();
58 value.contains("node_modules/")
59 || value.contains("/target/")
60 || value.contains("/vendor/")
61 || value.contains("/.venv/")
62 || value.contains("/dist/")
63 || value.contains("/build/")
64}
65
66pub fn likely_generated(content: &str) -> bool {
67 let head = content
68 .lines()
69 .take(8)
70 .collect::<Vec<_>>()
71 .join("\n")
72 .to_ascii_lowercase();
73 head.contains("@generated")
74 || head.contains("code generated")
75 || head.contains("automatically generated")
76 || head.contains("do not edit")
77}