#![cfg_attr(coverage_nightly, coverage(off))]
use super::{Variable, VariableInspector};
use std::path::Path;
use tree_sitter::Parser;
impl VariableInspector {
pub fn inspect_rust(&self, source: &str, line: usize) -> Result<Vec<Variable>, String> {
let mut parser = Parser::new();
parser
.set_language(&tree_sitter_rust::LANGUAGE.into())
.map_err(|e| format!("Failed to set Rust language: {}", e))?;
let tree = parser
.parse(source, None)
.ok_or_else(|| "Failed to parse Rust source".to_string())?;
self.extract_variables_rust(&tree, source, line)
}
pub fn inspect_typescript(&self, source: &str, line: usize) -> Result<Vec<Variable>, String> {
let mut parser = Parser::new();
parser
.set_language(&tree_sitter_typescript::LANGUAGE_TYPESCRIPT.into())
.map_err(|e| format!("Failed to set TypeScript language: {}", e))?;
let tree = parser
.parse(source, None)
.ok_or_else(|| "Failed to parse TypeScript source".to_string())?;
self.extract_variables_typescript(&tree, source, line)
}
#[cfg(feature = "python-ast")]
pub fn inspect_python(&self, source: &str, line: usize) -> Result<Vec<Variable>, String> {
let mut parser = Parser::new();
parser
.set_language(&tree_sitter_python::LANGUAGE.into())
.map_err(|e| format!("Failed to set Python language: {}", e))?;
let tree = parser
.parse(source, None)
.ok_or_else(|| "Failed to parse Python source".to_string())?;
self.extract_variables_python(&tree, source, line)
}
#[cfg(not(feature = "python-ast"))]
pub fn inspect_python(&self, _source: &str, _line: usize) -> Result<Vec<Variable>, String> {
Err("python-ast feature is disabled".to_string())
}
pub fn inspect_file(&self, path: &Path, line: usize) -> Result<Vec<Variable>, String> {
let source =
std::fs::read_to_string(path).map_err(|e| format!("Failed to read file: {}", e))?;
let ext = path
.extension()
.and_then(|e| e.to_str())
.ok_or_else(|| "No file extension".to_string())?;
match ext {
"rs" => self.inspect_rust(&source, line),
"ts" | "tsx" => self.inspect_typescript(&source, line),
"js" | "jsx" => self.inspect_typescript(&source, line), "py" => self.inspect_python(&source, line),
_ => Err(format!("Unsupported file extension: {}", ext)),
}
}
}