1use super::utils::*;
2use crate::core::rules::base::ErasedRule;
3use crate::rules::rules;
4use anstyle::{AnsiColor, Style};
5use std::borrow::Cow;
6
7const BLUE: Style = AnsiColor::Blue.on_default();
8const YELLOW: Style = AnsiColor::Yellow.on_default();
9
10#[derive(Debug)]
11pub struct RulesFormatter {
12 rules: Vec<ErasedRule>,
13 plain_output: bool,
14}
15
16impl Default for RulesFormatter {
17 fn default() -> Self {
18 Self {
19 rules: rules(),
20 plain_output: false,
21 }
22 }
23}
24
25impl RulesFormatter {
26 pub fn new(nocolor: bool) -> Self {
27 Self {
28 rules: rules(),
29 plain_output: should_produce_plain_output(nocolor),
30 }
31 }
32
33 fn colorize<'a>(&self, s: &'a str, style: Style) -> Cow<'a, str> {
34 colorize_helper(self.plain_output, s, style)
35 }
36
37 fn format_groups(&self, rule: &ErasedRule) -> String {
38 rule.groups()
39 .iter()
40 .map(|group| group.as_ref())
41 .collect::<Vec<&str>>()
42 .join(", ")
43 }
44
45 fn format_rule(&self, rule: &ErasedRule) -> String {
46 let group = self.format_groups(rule);
47 let code = self.colorize(rule.code(), BLUE);
48 let name = self.colorize(rule.name(), BLUE);
49 let decription = &rule.description();
50 let groups = self.colorize(group.as_str(), YELLOW);
51
52 format!("{code}:\t[{name}] {decription}\n\tgroups: {groups}")
53 }
54
55 pub fn rules_info(&self) {
56 println!("==== sqruff - rules ====");
57 for rule in self.rules.clone() {
58 let rule_info = self.format_rule(&rule);
59 println!("{rule_info}");
60 }
61 }
62}