use super::error::Result;
use super::types::{Finding, Language, ParsedFile};
use std::path::Path;
pub trait ParseTree: Send + Sync {
fn language(&self) -> Language;
fn root(&self) -> Box<dyn TreeNode + '_>;
fn debug_string(&self) -> String;
fn source(&self) -> &str;
}
pub trait TreeNode: Send + Sync {
fn node_type(&self) -> &str;
fn children(&self) -> Vec<Box<dyn TreeNode + '_>>;
fn text(&self) -> &str;
fn start_byte(&self) -> usize;
fn end_byte(&self) -> usize;
fn start_line(&self) -> usize;
fn start_column(&self) -> usize;
fn end_line(&self) -> usize;
fn end_column(&self) -> usize;
}
pub trait LanguageParser: Send + Sync {
fn language(&self) -> Language;
fn extensions(&self) -> &[&str];
fn parse(&self, source: &str) -> Result<Box<dyn ParseTree>>;
fn parse_file(&self, file_path: &str, source: &str) -> Result<ParsedFile>;
}
pub trait CompiledPattern: Send + Sync {
fn find_matches(
&self,
tree: &dyn ParseTree,
file_path: &Path,
code: &str,
) -> Result<Vec<PatternMatch>>;
fn rule_id(&self) -> &str;
fn language(&self) -> Language;
}
pub trait PatternMatcher: Send + Sync {
fn compile_pattern(&self, pattern: &str) -> Result<Box<dyn CompiledPattern>>;
fn language(&self) -> Language;
}
#[derive(Debug, Clone)]
pub struct PatternMatch {
pub rule_id: String,
pub start_line: usize,
pub start_column: usize,
pub end_line: usize,
pub end_column: usize,
pub matched_text: String,
pub bindings: Vec<(String, String)>,
}
pub trait Reporter: Send + Sync {
fn report(&self, findings: &[Finding]) -> Result<String>;
fn format_name(&self) -> &str;
}
pub trait ProgressReporter: Send + Sync {
fn update(&self, current: u64, total: u64, message: &str);
fn finish(&self, summary: &str);
fn warn(&self, message: &str);
}