1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
use ahash::AHashMap;

use crate::core::config::Value;
use crate::core::rules::base::{ErasedRule, LintResult, Rule};
use crate::core::rules::context::RuleContext;
use crate::core::rules::crawlers::{Crawler, RootOnlyCrawler};
use crate::utils::reflow::sequence::{Filter, ReflowSequence};

/// Unnecessary trailing whitespace.
///
///     **Anti-pattern**
///     The ``•`` character represents a space.
///     .. code-block:: sql
///        :force:
///         SELECT
///             a
///         FROM foo••
///    **Best practice**
///     Remove trailing spaces.
///     .. code-block:: sql
///         SELECT
///             a
///         FROM foo
#[derive(Default, Debug, Clone)]
pub struct RuleL001 {}

impl Rule for RuleL001 {
    fn load_from_config(&self, _config: &AHashMap<String, Value>) -> ErasedRule {
        unimplemented!()
    }

    fn name(&self) -> &'static str {
        "trailing whitespace"
    }

    fn description(&self) -> &'static str {
        "Unnecessary trailing whitespace."
    }

    /// Unnecessary trailing whitespace.
    ///
    /// Look for newline segments, and then evaluate what
    // it was preceded by.
    fn eval(&self, context: RuleContext) -> Vec<LintResult> {
        let sequence = ReflowSequence::from_root(context.segment, context.config.unwrap());
        sequence.respace(false, Filter::All).results()
    }

    fn crawl_behaviour(&self) -> Crawler {
        RootOnlyCrawler.into()
    }
}

#[cfg(test)]
mod tests {
    use crate::api::simple::fix;
    use crate::core::rules::base::Erased;
    use crate::rules::l001::RuleL001;

    #[test]
    fn test_pass_bigquery_trailing_comma() {
        let sql =
            fix("SELECT * FROM(SELECT 1 AS C1)AS T1;".into(), vec![RuleL001::default().erased()]);
        // FIXME: ` ;` -> `;`
        assert_eq!(sql, "SELECT * FROM (SELECT 1 AS C1) AS T1;");
    }
}