use std::path::Path;
pub fn is_valid_identifier(name: &str) -> bool {
if name.is_empty() {
return false;
}
let mut chars = name.chars();
let first = chars.next().unwrap();
if !first.is_alphabetic() && first != '_' {
return false;
}
chars.all(|c| c.is_alphanumeric() || c == '_')
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum LangCategory {
Python,
CLike,
Other,
}
#[allow(dead_code)]
pub fn detect_lang(path: &Path) -> LangCategory {
match path.extension().and_then(|e| e.to_str()) {
Some("py" | "pyi" | "pyw") => LangCategory::Python,
Some(
"c" | "cpp" | "cc" | "cxx" | "h" | "hpp" | "java" | "js" | "ts" | "tsx" | "jsx" | "go"
| "rs" | "cs" | "swift" | "kt" | "scala" | "m" | "mm",
) => LangCategory::CLike,
_ => LangCategory::Other,
}
}
pub fn truncate(s: &str, max: usize) -> String {
if s.len() <= max {
s.to_string()
} else {
format!("{}...", &s[..max])
}
}
pub fn relative_display(path: &Path, base: &Path) -> String {
path.strip_prefix(base)
.map(|p| p.display().to_string())
.unwrap_or_else(|_| path.display().to_string())
}
#[cfg(test)]
#[path = "util_tests.rs"]
mod tests;