sqruff_lib/
rules.rs

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