#![allow(dead_code)]
use serde::{Deserialize, Serialize};
use std::collections::{HashMap, HashSet};
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct FunctionData {
pub qualified_name: String,
pub file_path: String,
pub line_start: u32,
pub line_end: u32,
pub complexity: i32,
pub loc: i32,
pub parameters: Vec<String>,
pub return_type: Option<String>,
pub is_async: bool,
pub decorators: Vec<String>,
pub docstring: Option<String>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct ClassData {
pub qualified_name: String,
pub file_path: String,
pub line_start: u32,
pub line_end: u32,
pub complexity: i32,
pub method_count: i32,
pub methods: Vec<String>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct FileData {
pub file_path: String,
pub loc: i64,
pub language: String,
}
#[derive(Debug, Clone, Default)]
pub struct QueryCache {
pub functions: HashMap<String, FunctionData>,
pub classes: HashMap<String, ClassData>,
pub files: HashMap<String, FileData>,
pub calls: HashMap<String, HashSet<String>>,
pub imports: HashMap<String, HashSet<String>>,
pub inheritance: HashMap<String, HashSet<String>>,
pub functions_by_file: HashMap<String, Vec<String>>,
pub classes_by_file: HashMap<String, Vec<String>>,
pub callers: HashMap<String, HashSet<String>>,
}
impl QueryCache {
pub fn new() -> Self {
Self::default()
}
pub fn get_fan_in(&self, qn: &str) -> usize {
self.callers.get(qn).map(|s| s.len()).unwrap_or(0)
}
pub fn get_fan_out(&self, qn: &str) -> usize {
self.calls.get(qn).map(|s| s.len()).unwrap_or(0)
}
pub fn get_functions_in_file(&self, file_path: &str) -> Vec<&FunctionData> {
self.functions_by_file
.get(file_path)
.map(|qns| qns.iter().filter_map(|qn| self.functions.get(qn)).collect())
.unwrap_or_default()
}
pub fn get_classes_in_file(&self, file_path: &str) -> Vec<&ClassData> {
self.classes_by_file
.get(file_path)
.map(|qns| qns.iter().filter_map(|qn| self.classes.get(qn)).collect())
.unwrap_or_default()
}
}