1use std::fmt;
2
3#[derive(Debug)]
5#[cfg_attr(
6 feature = "unstable_machinery_serde",
7 derive(serde::Serialize),
8 serde(tag = "name", content = "payload")
9)]
10pub enum Token<'a> {
11 TemplateData(&'a str),
13 VariableStart,
15 VariableEnd,
17 BlockStart,
19 BlockEnd,
21 Ident(&'a str),
23 Str(&'a str),
25 String(Box<str>),
27 Int(u64),
29 Int128(Box<u128>),
31 Float(f64),
33 Plus,
35 Minus,
37 Mul,
39 Div,
41 FloorDiv,
43 Pow,
45 Mod,
47 Dot,
49 Comma,
51 Colon,
53 Tilde,
55 Assign,
57 Pipe,
59 Eq,
61 Ne,
63 Gt,
65 Gte,
67 Lt,
69 Lte,
71 BracketOpen,
73 BracketClose,
75 ParenOpen,
77 ParenClose,
79 BraceOpen,
81 BraceClose,
83}
84
85impl fmt::Display for Token<'_> {
86 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
87 match self {
88 Token::TemplateData(_) => f.write_str("template-data"),
89 Token::VariableStart => f.write_str("start of variable block"),
90 Token::VariableEnd => f.write_str("end of variable block"),
91 Token::BlockStart => f.write_str("start of block"),
92 Token::BlockEnd => f.write_str("end of block"),
93 Token::Ident(_) => f.write_str("identifier"),
94 Token::Str(_) | Token::String(_) => f.write_str("string"),
95 Token::Int(_) | Token::Int128(_) => f.write_str("integer"),
96 Token::Float(_) => f.write_str("float"),
97 Token::Plus => f.write_str("`+`"),
98 Token::Minus => f.write_str("`-`"),
99 Token::Mul => f.write_str("`*`"),
100 Token::Div => f.write_str("`/`"),
101 Token::FloorDiv => f.write_str("`//`"),
102 Token::Pow => f.write_str("`**`"),
103 Token::Mod => f.write_str("`%`"),
104 Token::Dot => f.write_str("`.`"),
105 Token::Comma => f.write_str("`,`"),
106 Token::Colon => f.write_str("`:`"),
107 Token::Tilde => f.write_str("`~`"),
108 Token::Assign => f.write_str("`=`"),
109 Token::Pipe => f.write_str("`|`"),
110 Token::Eq => f.write_str("`==`"),
111 Token::Ne => f.write_str("`!=`"),
112 Token::Gt => f.write_str("`>`"),
113 Token::Gte => f.write_str("`>=`"),
114 Token::Lt => f.write_str("`<`"),
115 Token::Lte => f.write_str("`<=`"),
116 Token::BracketOpen => f.write_str("`[`"),
117 Token::BracketClose => f.write_str("`]`"),
118 Token::ParenOpen => f.write_str("`(`"),
119 Token::ParenClose => f.write_str("`)`"),
120 Token::BraceOpen => f.write_str("`{`"),
121 Token::BraceClose => f.write_str("`}`"),
122 }
123 }
124}
125
126#[derive(Clone, Copy, Default, PartialEq, Eq)]
128#[cfg_attr(feature = "unstable_machinery_serde", derive(serde::Serialize))]
129pub struct Span {
130 pub start_line: u16,
131 pub start_col: u16,
132 pub start_offset: u32,
133 pub end_line: u16,
134 pub end_col: u16,
135 pub end_offset: u32,
136}
137
138impl fmt::Debug for Span {
139 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
140 if f.alternate() {
141 f.debug_struct("Span")
142 .field("start_line", &self.start_line)
143 .field("start_col", &self.start_col)
144 .field("start_offset", &self.start_offset)
145 .field("end_line", &self.end_line)
146 .field("end_col", &self.end_col)
147 .field("end_offset", &self.end_offset)
148 .finish()
149 } else {
150 write!(
151 f,
152 " @ {}:{}-{}:{}",
153 self.start_line, self.start_col, self.end_line, self.end_col
154 )
155 }
156 }
157}