1pub mod avoid_mutable_accumulation;
2pub mod brace_spacing;
3pub mod completion_function_naming;
4pub mod consistent_error_handling;
5pub mod descriptive_error_messages;
6pub mod discourage_bare_ignore;
7pub mod discourage_underscore_commands;
8pub mod escape_string_interpolation_operators;
9pub mod exported_function_docs;
10pub mod kebab_case_commands;
11pub mod max_positional_params;
12pub mod missing_command_docs;
13pub mod missing_type_annotation;
14pub mod multiline_formatting;
15pub mod no_trailing_spaces;
16pub mod omit_list_commas;
17pub mod pipe_spacing;
18pub mod prefer_builtin_commands;
19pub mod prefer_builtin_system_commands;
20pub mod prefer_builtin_text_transforms;
21pub mod prefer_compound_assignment;
22pub mod prefer_each_over_for;
23pub mod prefer_error_make;
24pub mod prefer_is_not_empty;
25pub mod prefer_lines_over_split;
26pub mod prefer_match_over_if_chain;
27pub mod prefer_parse_command;
28pub mod prefer_parse_over_each_split;
29pub mod prefer_range_iteration;
30pub mod prefer_where_over_each_if;
31pub mod screaming_snake_constants;
32pub mod snake_case_variables;
33pub mod unnecessary_mut;
34pub mod unnecessary_variable_before_return;
35
36use std::collections::HashMap;
37
38use crate::rule::Rule;
39
40pub struct RuleRegistry {
41 rules: HashMap<&'static str, Rule>,
42}
43
44impl RuleRegistry {
45 #[must_use]
46 pub fn new() -> Self {
47 Self {
48 rules: HashMap::new(),
49 }
50 }
51
52 pub fn register(&mut self, rule: Rule) {
53 self.rules.insert(rule.id, rule);
54 }
55
56 #[must_use]
57 pub fn get_rule(&self, id: &str) -> Option<&Rule> {
58 self.rules.get(id)
59 }
60
61 pub fn all_rules(&self) -> impl Iterator<Item = &Rule> {
62 self.rules.values()
63 }
64
65 #[must_use]
66 pub fn with_default_rules() -> Self {
67 let mut registry = Self::new();
68
69 registry.register(snake_case_variables::rule());
70 registry.register(kebab_case_commands::rule());
71 registry.register(screaming_snake_constants::rule());
72 registry.register(unnecessary_variable_before_return::rule());
73 registry.register(prefer_is_not_empty::rule());
74 registry.register(discourage_bare_ignore::rule());
75 registry.register(discourage_underscore_commands::rule());
76 registry.register(completion_function_naming::rule());
77 registry.register(escape_string_interpolation_operators::rule());
78 registry.register(multiline_formatting::rule());
79 registry.register(no_trailing_spaces::rule());
80 registry.register(brace_spacing::rule());
81 registry.register(pipe_spacing::rule());
82 registry.register(prefer_compound_assignment::rule());
83 registry.register(unnecessary_mut::rule());
84 registry.register(omit_list_commas::rule());
85 registry.register(prefer_error_make::rule());
86 registry.register(avoid_mutable_accumulation::rule());
87 registry.register(prefer_range_iteration::rule());
88 registry.register(prefer_parse_command::rule());
89 registry.register(consistent_error_handling::rule());
90 registry.register(prefer_match_over_if_chain::rule());
91 registry.register(prefer_each_over_for::rule());
92 registry.register(descriptive_error_messages::rule());
93 registry.register(prefer_builtin_commands::rule());
94 registry.register(prefer_builtin_text_transforms::rule());
95 registry.register(prefer_builtin_system_commands::rule());
96 registry.register(prefer_where_over_each_if::rule());
97 registry.register(prefer_lines_over_split::rule());
98 registry.register(prefer_parse_over_each_split::rule());
99 registry.register(missing_command_docs::rule());
100 registry.register(exported_function_docs::rule());
101 registry.register(missing_type_annotation::rule());
102 registry.register(max_positional_params::rule());
103
104 registry
105 }
106}
107
108impl Default for RuleRegistry {
109 fn default() -> Self {
110 Self::new()
111 }
112}