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
use std::path::Path;
use anyhow::Result;
use crate::{Dictionary, StorageBackend};
use crate::{Project, RelativePath};
pub trait Checker {
type Context;
fn handle_error(
&mut self,
error: &str,
path: &RelativePath,
context: &Self::Context,
) -> Result<()>;
fn success(&self) -> Result<()>;
fn storage_backend(&self) -> &StorageBackend;
fn dictionary(&self) -> &dyn Dictionary;
fn project(&self) -> &Project;
fn to_relative_path(&self, path: &Path) -> Result<RelativePath> {
let project_path = self.project().path();
RelativePath::new(project_path, path)
}
fn handle_token(
&mut self,
token: &str,
relative_path: &RelativePath,
context: &Self::Context,
) -> Result<()> {
let dictionary = self.dictionary();
let in_dict = dictionary.check(token)?;
if in_dict {
return Ok(());
}
let project_id = self.project().id();
let should_ignore =
self.storage_backend()
.should_ignore(token, project_id, relative_path)?;
if !should_ignore {
self.handle_error(token, relative_path, context)?
}
Ok(())
}
}