use crate::domain::report::AnalysisReport;
use crate::domain::request::AnalysisConfig;
use crate::domain::types::{Finding, LanguageId, SourceFile};
use std::path::{Path, PathBuf};
pub trait WorkspaceDiscovery: Send + Sync {
fn discover(
&self,
root: &Path,
languages: &[LanguageId],
exclusions: &[String],
) -> Result<Vec<PathBuf>, String>;
}
pub trait SourceLoader: Send + Sync {
fn load(&self, path: &Path, language: LanguageId) -> Result<SourceFile, String>;
}
pub trait ConfigLoader: Send + Sync {
fn load_analysis_config(&self, root: &Path) -> Result<AnalysisConfig, String>;
}
pub trait DiagnosticRenderer: Send + Sync {
fn render(&self, report: &AnalysisReport) -> Result<String, String>;
}
pub trait AnalysisCache: Send + Sync {
fn get(&self, key: &str) -> Option<Vec<Finding>>;
fn put(&self, key: &str, findings: &[Finding]);
}
pub trait SourceWriter: Send + Sync {
fn write(&self, path: &Path, content: &str) -> Result<(), String>;
}
pub fn content_hash(content: &str) -> String {
blake3::hash(content.as_bytes()).to_hex().to_string()
}