garbage_code_hunter/rules/
mod.rs

1use std::path::Path;
2use syn::File;
3
4use crate::analyzer::CodeIssue;
5
6pub mod complexity;
7pub mod naming;
8pub mod rust_specific;
9pub mod advanced_rust;
10pub mod comprehensive_rust;
11
12pub trait Rule {
13    #[allow(dead_code)]
14    fn name(&self) -> &'static str;
15    fn check(&self, file_path: &Path, syntax_tree: &File, content: &str) -> Vec<CodeIssue>;
16}
17
18pub struct RuleEngine {
19    rules: Vec<Box<dyn Rule>>,
20}
21
22impl RuleEngine {
23    pub fn new() -> Self {
24        let mut rules: Vec<Box<dyn Rule>> = Vec::new();
25
26        // Add various detection rules
27        rules.push(Box::new(naming::TerribleNamingRule));
28        rules.push(Box::new(naming::SingleLetterVariableRule));
29        rules.push(Box::new(complexity::DeepNestingRule));
30        rules.push(Box::new(complexity::LongFunctionRule));
31        rules.push(Box::new(rust_specific::UnwrapAbuseRule));
32        rules.push(Box::new(rust_specific::UnnecessaryCloneRule));
33        
34        // Add advanced Rust-specific rules
35        rules.push(Box::new(advanced_rust::ComplexClosureRule));
36        rules.push(Box::new(advanced_rust::LifetimeAbuseRule));
37        rules.push(Box::new(advanced_rust::TraitComplexityRule));
38        rules.push(Box::new(advanced_rust::GenericAbuseRule));
39        
40        // Add comprehensive Rust feature rules
41        rules.push(Box::new(comprehensive_rust::ChannelAbuseRule));
42        rules.push(Box::new(comprehensive_rust::AsyncAbuseRule));
43        rules.push(Box::new(comprehensive_rust::DynTraitAbuseRule));
44        rules.push(Box::new(comprehensive_rust::UnsafeAbuseRule));
45        rules.push(Box::new(comprehensive_rust::FFIAbuseRule));
46        rules.push(Box::new(comprehensive_rust::MacroAbuseRule));
47        rules.push(Box::new(comprehensive_rust::ModuleComplexityRule));
48        rules.push(Box::new(comprehensive_rust::PatternMatchingAbuseRule));
49        rules.push(Box::new(comprehensive_rust::ReferenceAbuseRule));
50        rules.push(Box::new(comprehensive_rust::BoxAbuseRule));
51        rules.push(Box::new(comprehensive_rust::SliceAbuseRule));
52
53        Self { rules }
54    }
55
56    pub fn check_file(
57        &self,
58        file_path: &Path,
59        syntax_tree: &File,
60        content: &str,
61    ) -> Vec<CodeIssue> {
62        let mut issues = Vec::new();
63
64        for rule in &self.rules {
65            issues.extend(rule.check(file_path, syntax_tree, content));
66        }
67
68        issues
69    }
70}