sqruff_lib/rules/layout/
lt02.rsuse ahash::AHashMap;
use crate::core::config::Value;
use crate::core::rules::base::{Erased, ErasedRule, LintResult, Rule, RuleGroups};
use crate::core::rules::context::RuleContext;
use crate::core::rules::crawlers::{Crawler, RootOnlyCrawler};
use crate::utils::reflow::sequence::ReflowSequence;
#[derive(Default, Debug, Clone)]
pub struct RuleLT02;
impl Rule for RuleLT02 {
fn load_from_config(&self, _config: &AHashMap<String, Value>) -> Result<ErasedRule, String> {
Ok(RuleLT02.erased())
}
fn name(&self) -> &'static str {
"layout.indent"
}
fn description(&self) -> &'static str {
"Incorrect Indentation."
}
fn long_description(&self) -> &'static str {
r#"
**Anti-pattern**
The ``•`` character represents a space and the ``→`` character represents a tab.
In this example, the third line contains five spaces instead of four and
the second line contains two spaces and one tab.
```sql
SELECT
••→a,
•••••b
FROM foo
```
**Best practice**
Change the indentation to use a multiple of four spaces. This example also assumes that the indent_unit config value is set to space. If it had instead been set to tab, then the indents would be tabs instead.
```sql
SELECT
••••a,
••••b
FROM foo
```
"#
}
fn groups(&self) -> &'static [RuleGroups] {
&[RuleGroups::All, RuleGroups::Core, RuleGroups::Layout]
}
fn eval(&self, context: RuleContext) -> Vec<LintResult> {
ReflowSequence::from_root(context.segment, context.config)
.reindent(context.tables)
.results()
}
fn is_fix_compatible(&self) -> bool {
true
}
fn crawl_behaviour(&self) -> Crawler {
RootOnlyCrawler.into()
}
}