chem_parse/
token_types.rs

1use core::fmt::Debug;
2
3/// A parenthesis type.
4/// '(' is `OPEN` and ')' is `CLOSE`
5#[derive(Debug, PartialEq)]
6pub enum ParenType {
7    OPEN,
8    CLOSE,
9}
10
11/// A token which may have attached data
12#[derive(Debug)]
13pub enum Tokens {
14    /// Elements e.g. Fe. The data is "Fe"
15    Element { data: String, meta: TokenMetadata },
16    /// Numbers e.g. 13. The data is 13u16
17    Number { data: u16, meta: TokenMetadata },
18    /// Parenthesis e.g. ) The data is ParenType::CLOSE
19    Paren {
20        data: ParenType,
21        meta: TokenMetadata,
22    },
23    /// Plus sign +
24    Plus { meta: TokenMetadata },
25    /// Yields sign ->
26    Yields { meta: TokenMetadata },
27}
28
29impl Tokens {
30    pub fn meta(&self) -> &TokenMetadata {
31        match self {
32            Self::Element { meta, data: _ } => meta,
33            Self::Number { meta, data: _ } => meta,
34            Self::Paren { meta, data: _ } => meta,
35            Self::Plus { meta } => meta,
36            Self::Yields { meta } => meta,
37        }
38    }
39}
40
41impl PartialEq for Tokens {
42    fn eq(&self, other: &Self) -> bool {
43        match (self, other) {
44            (
45                Self::Element {
46                    data: l_data,
47                    meta: _,
48                },
49                Self::Element {
50                    data: r_data,
51                    meta: _,
52                },
53            ) => l_data == r_data,
54            (
55                Self::Number {
56                    data: l_data,
57                    meta: _,
58                },
59                Self::Number {
60                    data: r_data,
61                    meta: _,
62                },
63            ) => l_data == r_data,
64            (
65                Self::Paren {
66                    data: l_data,
67                    meta: _,
68                },
69                Self::Paren {
70                    data: r_data,
71                    meta: _,
72                },
73            ) => l_data == r_data,
74            (Self::Plus { meta: _ }, Self::Plus { meta: _ }) => true,
75            (Self::Yields { meta: _ }, Self::Yields { meta: _ }) => true,
76            _ => false,
77        }
78    }
79}
80
81#[derive(Debug)]
82pub struct TokenMetadata {
83    raw: String,
84    location: usize,
85}
86
87impl TokenMetadata {
88    pub fn new(raw: &str, location: usize) -> Self {
89        Self {
90            raw: raw.into(),
91            location,
92        }
93    }
94    pub fn raw(&self) -> &String {
95        &self.raw
96    }
97    pub fn loc(&self) -> usize {
98        self.location
99    }
100}