use rma_common::{Finding, Language};
use rma_parser::ParsedFile;
use tree_sitter::Node;
pub trait Rule: Send + Sync {
fn id(&self) -> &str;
fn description(&self) -> &str;
fn applies_to(&self, lang: Language) -> bool;
fn check(&self, parsed: &ParsedFile) -> Vec<Finding>;
}
pub fn create_finding(
rule_id: &str,
node: &Node,
path: &std::path::Path,
content: &str,
severity: rma_common::Severity,
message: &str,
language: Language,
) -> Finding {
let start = node.start_position();
let end = node.end_position();
let snippet = node.utf8_text(content.as_bytes()).ok().map(|s: &str| {
if s.chars().count() > 200 {
let truncated: String = s.chars().take(200).collect();
format!("{}...", truncated)
} else {
s.to_string()
}
});
Finding {
id: format!("{}-{}-{}", rule_id, start.row, start.column),
rule_id: rule_id.to_string(),
message: message.to_string(),
severity,
location: rma_common::SourceLocation::new(
path.to_path_buf(),
start.row + 1,
start.column + 1,
end.row + 1,
end.column + 1,
),
language,
snippet,
suggestion: None,
}
}