garbage_code_hunter/rules/
mod.rs1use 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 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 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 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}