summaryrefslogtreecommitdiff
path: root/src/visitor/linting.rs
blob: 03b49ee0013e987d19067853f31514d10bed43ce (plain)
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
use crate::panhelper;
use crate::SubplotError;

use pandoc_ast::{Block, MutVisitor};

#[derive(Default)]
pub struct LintingVisitor {
    pub issues: Vec<SubplotError>,
}

impl MutVisitor for LintingVisitor {
    fn visit_vec_block(&mut self, vec_block: &mut Vec<Block>) {
        for block in vec_block {
            match block {
                Block::CodeBlock(attr, _) => {
                    if panhelper::is_class(attr, "file") {
                        let newlines: Vec<_> =
                            panhelper::find_attr_kv(attr, "add-newline").collect();
                        match newlines.len() {
                            0 => {}
                            1 => match newlines[0].to_ascii_lowercase().as_ref() {
                                "auto" | "yes" | "no" => {}
                                _ => self.issues.push(SubplotError::UnrecognisedAddNewline(
                                    panhelper::get_filename(attr),
                                    newlines[0].to_owned(),
                                )),
                            },
                            _ => self.issues.push(SubplotError::RepeatedAddNewlineAttribute(
                                panhelper::get_filename(attr),
                            )),
                        }
                    }
                }
                _ => {
                    self.visit_block(block);
                }
            }
        }
    }
}