Skip to main content

mdlint/lint/
rule.rs

1use crate::markdown::MarkdownParser;
2use crate::types::Violation;
3use serde_json::Value;
4use std::collections::HashMap;
5
6pub trait Rule: Send + Sync {
7    fn name(&self) -> &str;
8    fn description(&self) -> &str;
9    fn tags(&self) -> &[&str];
10
11    /// Check the markdown content for violations
12    fn check(&self, parser: &MarkdownParser, config: Option<&Value>) -> Vec<Violation>;
13
14    /// Whether this rule can automatically fix violations
15    fn fixable(&self) -> bool {
16        false
17    }
18}
19
20#[derive(Default)]
21pub struct RuleRegistry {
22    rules: HashMap<String, Box<dyn Rule + Send + Sync>>,
23}
24
25impl RuleRegistry {
26    pub fn new() -> Self {
27        Self::default()
28    }
29
30    pub fn register(&mut self, rule: Box<dyn Rule + Send + Sync>) {
31        self.rules.insert(rule.name().to_string(), rule);
32    }
33
34    pub fn get(&self, name: &str) -> Option<&dyn Rule> {
35        self.rules.get(name).map(|r| r.as_ref() as &dyn Rule)
36    }
37
38    pub fn all_rules(&self) -> impl Iterator<Item = &dyn Rule> {
39        self.rules.values().map(|r| r.as_ref() as &dyn Rule)
40    }
41}