1use 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}