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
use moore_common::grind::Grinder;
use moore_common::errors::DiagBuilder2;
pub struct Categorizer<T> {
inner: T,
}
impl<T> Categorizer<T> where T: Grinder<Item=Option<(usize, char, u8)>, Error=DiagBuilder2> {
pub fn new(inner: T) -> Categorizer<T> {
Categorizer { inner: inner }
}
}
impl<T> Grinder for Categorizer<T> where T: Grinder<Item=Option<(usize, char, u8)>, Error=DiagBuilder2> {
type Item = Option<(usize, char, u8, Category)>;
type Error = DiagBuilder2;
fn emit(&mut self, err: Self::Error) {
self.inner.emit(err);
}
fn next(&mut self) -> Self::Item {
let (offset, c, sz) = match self.inner.next() {
Some(v) => v,
None => return None,
};
let cat = match c {
'"' | '#' | '&' | '\'' | '(' | ')' | '*' | '+' | ',' | '-' | '.' |
'/' | ':' | ';' | '<' | '=' | '>' | '?' | '@' | '[' | ']' | '_' |
'`' | '|' => Category::Special,
c if c.is_alphabetic() => Category::Letter,
c if c.is_digit(10) => Category::Digit,
c if c.is_whitespace() => Category::Space,
_ => Category::Other,
};
Some((offset, c, sz, cat))
}
}
#[derive(Copy, Clone, PartialEq, Eq, Debug)]
pub enum Category {
Letter,
Digit,
Special,
Space,
Other,
}