Skip to main content

open_kioku_languages/
lib.rs

1use 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}