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}