nu_lint/rules/
mod.rs

1pub mod avoid_jq_for_simple_ops;
2pub mod avoid_mutable_accumulation;
3pub mod brace_spacing;
4pub mod check_complete_exit_code;
5pub mod completion_function_naming;
6pub mod dangerous_file_operations;
7pub mod descriptive_error_messages;
8pub mod discourage_bare_ignore;
9pub mod discourage_underscore_commands;
10pub mod escape_string_interpolation_operators;
11pub mod exported_function_docs;
12pub mod kebab_case_commands;
13pub mod max_positional_params;
14pub mod missing_command_docs;
15pub mod missing_type_annotation;
16pub mod multiline_formatting;
17pub mod no_trailing_spaces;
18pub mod nu_parse_error;
19pub mod omit_list_commas;
20pub mod pipe_spacing;
21pub mod prefer_builtin;
22pub mod prefer_compound_assignment;
23pub mod prefer_each_over_for;
24pub mod prefer_error_make;
25pub mod prefer_from_json;
26pub mod prefer_is_not_empty;
27pub mod prefer_lines_over_split;
28pub mod prefer_match_over_if_chain;
29pub mod prefer_nushell_data_ops;
30pub mod prefer_parse_command;
31pub mod prefer_parse_over_each_split;
32pub mod prefer_range_iteration;
33pub mod prefer_structured_data_flow;
34pub mod prefer_where_over_each_if;
35pub mod require_external_command_error_check;
36pub mod require_long_pipeline_error_handling;
37pub mod screaming_snake_constants;
38pub mod sequential_external_commands;
39pub mod snake_case_variables;
40pub mod systemd_journal_prefix;
41pub mod unnecessary_mut;
42pub mod unnecessary_variable_before_return;
43
44use std::collections::HashMap;
45
46use crate::rule::Rule;
47
48pub struct RuleRegistry {
49    rules: HashMap<&'static str, Rule>,
50}
51
52impl RuleRegistry {
53    #[must_use]
54    pub fn new() -> Self {
55        Self {
56            rules: HashMap::new(),
57        }
58    }
59
60    pub fn register(&mut self, rule: Rule) {
61        self.rules.insert(rule.id, rule);
62    }
63
64    #[must_use]
65    pub fn get_rule(&self, id: &str) -> Option<&Rule> {
66        self.rules.get(id)
67    }
68
69    pub fn all_rules(&self) -> impl Iterator<Item = &Rule> {
70        self.rules.values()
71    }
72
73    #[must_use]
74    pub fn with_default_rules() -> Self {
75        let mut registry = Self::new();
76
77        registry.register(avoid_jq_for_simple_ops::rule());
78        registry.register(avoid_mutable_accumulation::rule());
79        registry.register(brace_spacing::rule());
80        registry.register(check_complete_exit_code::rule());
81        registry.register(completion_function_naming::rule());
82        registry.register(dangerous_file_operations::rule());
83        registry.register(descriptive_error_messages::rule());
84        registry.register(discourage_bare_ignore::rule());
85        registry.register(discourage_underscore_commands::rule());
86        registry.register(escape_string_interpolation_operators::rule());
87        registry.register(exported_function_docs::rule());
88        registry.register(kebab_case_commands::rule());
89        registry.register(max_positional_params::rule());
90        registry.register(missing_command_docs::rule());
91        registry.register(missing_type_annotation::rule());
92        registry.register(multiline_formatting::rule());
93        registry.register(no_trailing_spaces::rule());
94        registry.register(nu_parse_error::rule());
95        registry.register(omit_list_commas::rule());
96        registry.register(pipe_spacing::rule());
97        // New individual prefer_builtin_* rules
98        registry.register(prefer_builtin::prefer_builtin_ls());
99        registry.register(prefer_builtin::prefer_builtin_cat());
100        registry.register(prefer_builtin::prefer_builtin_grep());
101        registry.register(prefer_builtin::prefer_builtin_find());
102        registry.register(prefer_builtin::prefer_builtin_head());
103        registry.register(prefer_builtin::prefer_builtin_tail());
104        registry.register(prefer_builtin::prefer_builtin_sort());
105        registry.register(prefer_builtin::prefer_builtin_uniq());
106        registry.register(prefer_builtin::prefer_builtin_sed());
107        registry.register(prefer_builtin::prefer_builtin_other());
108        registry.register(prefer_compound_assignment::rule());
109        registry.register(prefer_each_over_for::rule());
110        registry.register(prefer_error_make::rule());
111        registry.register(prefer_from_json::rule());
112        registry.register(prefer_is_not_empty::rule());
113        registry.register(prefer_lines_over_split::rule());
114        registry.register(prefer_match_over_if_chain::rule());
115        registry.register(prefer_nushell_data_ops::rule());
116        registry.register(prefer_parse_command::rule());
117        registry.register(prefer_parse_over_each_split::rule());
118        registry.register(prefer_range_iteration::rule());
119        registry.register(prefer_structured_data_flow::rule());
120        registry.register(prefer_where_over_each_if::rule());
121        registry.register(require_external_command_error_check::rule());
122        registry.register(require_long_pipeline_error_handling::rule());
123        registry.register(screaming_snake_constants::rule());
124        registry.register(sequential_external_commands::rule());
125        registry.register(snake_case_variables::rule());
126        registry.register(systemd_journal_prefix::rule());
127        registry.register(unnecessary_mut::rule());
128        registry.register(unnecessary_variable_before_return::rule());
129
130        registry
131    }
132}
133
134impl Default for RuleRegistry {
135    fn default() -> Self {
136        Self::new()
137    }
138}