sqruff_lib/cli/
rules.rs

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}