use anyhow::Result;
use std::collections::HashMap;
use super::RelationsProvider;
use super::types::{Definition, PrecisionLevel, Reference};
use crate::rag::indexer::FileInfo;
pub struct StackGraphsProvider {
supported: Vec<String>,
}
impl StackGraphsProvider {
pub fn new() -> Result<Self> {
Ok(Self {
supported: vec![
"Python".to_string(),
"TypeScript".to_string(),
"Java".to_string(),
"Ruby".to_string(),
],
})
}
}
impl RelationsProvider for StackGraphsProvider {
fn extract_definitions(&self, file_info: &FileInfo) -> Result<Vec<Definition>> {
let language = file_info.language.as_deref().unwrap_or("Unknown");
if !self.supports_language(language) {
return Ok(vec![]);
}
Ok(vec![])
}
fn extract_references(
&self,
file_info: &FileInfo,
_symbol_index: &HashMap<String, Vec<Definition>>,
) -> Result<Vec<Reference>> {
let language = file_info.language.as_deref().unwrap_or("Unknown");
if !self.supports_language(language) {
return Ok(vec![]);
}
Ok(vec![])
}
fn supports_language(&self, language: &str) -> bool {
self.supported.iter().any(|l| l == language)
}
fn precision_level(&self, language: &str) -> PrecisionLevel {
if self.supports_language(language) {
PrecisionLevel::High
} else {
PrecisionLevel::Low
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_stack_graphs_provider_creation() {
let provider = StackGraphsProvider::new().unwrap();
assert!(provider.supports_language("Python"));
assert!(provider.supports_language("TypeScript"));
assert!(!provider.supports_language("Rust"));
}
#[test]
fn test_precision_levels() {
let provider = StackGraphsProvider::new().unwrap();
assert_eq!(provider.precision_level("Python"), PrecisionLevel::High);
assert_eq!(provider.precision_level("Rust"), PrecisionLevel::Low);
}
}