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}