harper_core/linting/
boring_words.rs

1use crate::{
2    Token, TokenStringExt,
3    patterns::{Pattern, WordPatternGroup},
4};
5
6use super::{Lint, LintKind, PatternLinter};
7
8pub struct BoringWords {
9    pattern: Box<dyn Pattern>,
10}
11
12impl Default for BoringWords {
13    fn default() -> Self {
14        let mut pattern = WordPatternGroup::default();
15
16        pattern.add_word("very");
17        pattern.add_word("interesting");
18        pattern.add_word("several");
19        pattern.add_word("most");
20        pattern.add_word("many");
21
22        Self {
23            pattern: Box::new(pattern),
24        }
25    }
26}
27
28impl PatternLinter for BoringWords {
29    fn pattern(&self) -> &dyn Pattern {
30        self.pattern.as_ref()
31    }
32
33    fn match_to_lint(&self, matched_tokens: &[Token], source: &[char]) -> Option<Lint> {
34        let matched_word = matched_tokens.span()?.get_content_string(source);
35
36        Some(Lint {
37            span: matched_tokens.span()?,
38            lint_kind: LintKind::Enhancement,
39            suggestions: vec![],
40            message: format!(
41                "“{}” is a boring word. Try something a little more exotic.",
42                matched_word
43            ),
44            priority: 127,
45        })
46    }
47
48    fn description(&self) -> &'static str {
49        "This rule looks for particularly boring or overused words. Using varied language is an easy way to keep a reader's attention."
50    }
51}