sqruff_lib/
rules.rs

1use itertools::{Itertools, chain};
2use sqruff_lib_core::helpers::IndexMap;
3
4use crate::core::rules::base::{ErasedRule, RuleManifest, RuleSet};
5
6pub mod aliasing;
7pub mod ambiguous;
8pub mod capitalisation;
9pub mod convention;
10pub mod layout;
11pub mod references;
12pub mod structure;
13
14pub fn rules() -> Vec<ErasedRule> {
15    chain!(
16        aliasing::rules(),
17        ambiguous::rules(),
18        capitalisation::rules(),
19        convention::rules(),
20        layout::rules(),
21        references::rules(),
22        structure::rules()
23    )
24    .collect_vec()
25}
26
27pub fn get_ruleset() -> RuleSet {
28    let mut register = IndexMap::default();
29
30    let rules = rules();
31    register.reserve(rules.len());
32
33    for rule in rules {
34        register.insert(
35            rule.code(),
36            RuleManifest {
37                code: rule.code(),
38                name: rule.name(),
39                description: rule.description(),
40                groups: rule.groups(),
41                rule_class: rule,
42            },
43        );
44    }
45
46    RuleSet { register }
47}
48
49#[cfg(test)]
50mod tests {
51    use super::*;
52    use crate::core::rules::base::RuleGroups;
53
54    #[test]
55    fn no_rule_should_not_include_all_as_that_is_default() {
56        rules().iter().for_each(|rule| {
57            assert_eq!(*rule.groups().first().unwrap(), RuleGroups::All);
58        });
59    }
60
61    #[test]
62    fn no_should_contain_duplicate_groups() {
63        rules().iter().for_each(|rule| {
64            let groups = rule.groups();
65            assert_eq!(groups.len(), groups.iter().unique().count());
66        });
67    }
68
69    #[test]
70    fn if_rule_contains_core_is_second_in_list() {
71        rules().iter().for_each(|rule| {
72            let groups = rule.groups();
73            if groups.iter().any(|&rule| rule == RuleGroups::Core) {
74                assert_eq!(groups.get(1).unwrap(), &RuleGroups::Core);
75            }
76        })
77    }
78
79    #[test]
80    fn rule_skip_dialect_should_have_no_duplicates() {
81        rules().iter().for_each(|rule| {
82            let skips = rule.dialect_skip();
83            assert_eq!(skips.len(), skips.iter().unique().count());
84        })
85    }
86
87    #[test]
88    fn rule_skip_dialect_should_be_alphabetical() {
89        rules().iter().for_each(|rule| {
90            let skips = rule.dialect_skip();
91            for i in 1..skips.len() {
92                if skips[i].as_ref() < skips[i].as_ref() {
93                    panic!("not in alphabetical order in rule {}", rule.code())
94                }
95            }
96        })
97    }
98}