chore/
token.rs

1// An enum over the possible crate::field values.
2
3use crate::field::*;
4
5#[derive(PartialEq, Eq, PartialOrd, Ord, Hash)]
6pub enum Token<'a> {
7    Annotation(Annotation),
8    Context(Context<'a>),
9    End(End<'a>),
10    Entry(Entry<'a>),
11    Key(Key<'a>),
12    Marker(Marker),
13    Normal(Normal<'a>),
14    Pair(Pair<'a>),
15    Priority(Priority),
16    Project(Project<'a>),
17    Space(Space<'a>),
18}
19
20impl<'a> Token<'a> {
21    pub fn new(str: &'a str, stage: Stage) -> (Token<'a>, Stage) {
22        if let Some(space) = Space::new(str) {
23            match stage == Stage::Marker && !str.is_empty() {
24                true => (Token::Space(space), Stage::End),
25                false => (Token::Space(space), stage),
26            }
27        } else if let Some(marker) = Marker::new(str, stage) {
28            (Token::Marker(marker), Stage::End)
29        } else if let Some(end) = End::new(str, stage) {
30            (Token::End(end), Stage::Priority)
31        } else if let Some(pri) = Priority::new(str, stage) {
32            (Token::Priority(pri), Stage::Entry)
33        } else if let Some(entry) = Entry::new(str, stage) {
34            (Token::Entry(entry), Stage::Body)
35        } else if let Some(proj) = Project::new(str) {
36            (Token::Project(proj), Stage::Body)
37        } else if let Some(ctx) = Context::new(str) {
38            (Token::Context(ctx), Stage::Body)
39        } else if let Some(pair) = Pair::new(str) {
40            (Token::Pair(pair), Stage::Body)
41        } else if let Some(note) = Annotation::new(str) {
42            (Token::Annotation(note), Stage::Body)
43        } else {
44            (Token::Normal(Normal::new(str)), Stage::Body)
45        }
46    }
47
48    pub fn len(&self) -> usize {
49        match self {
50            Token::Space(t) => t.len(),
51            Token::Marker(t) => t.len(),
52            Token::End(t) => t.len(),
53            Token::Priority(t) => t.len(),
54            Token::Entry(t) => t.len(),
55            Token::Project(t) => t.len(),
56            Token::Context(t) => t.len(),
57            Token::Pair(t) => t.len(),
58            Token::Key(t) => t.len(),
59            Token::Annotation(t) => t.len(),
60            Token::Normal(t) => t.len(),
61        }
62    }
63}