1use std::fmt;
2
3#[derive(Debug, Clone, PartialEq)]
5pub enum StringSegment {
6 Literal(String),
7 Expression(String),
8}
9
10impl fmt::Display for StringSegment {
11 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
12 match self {
13 StringSegment::Literal(s) => write!(f, "{s}"),
14 StringSegment::Expression(e) => write!(f, "${{{e}}}"),
15 }
16 }
17}
18
19#[derive(Debug, Clone, Copy, PartialEq, Eq)]
21pub struct Span {
22 pub start: usize,
24 pub end: usize,
26 pub line: usize,
28 pub column: usize,
30}
31
32impl Span {
33 pub fn with_offsets(start: usize, end: usize, line: usize, column: usize) -> Self {
34 Self {
35 start,
36 end,
37 line,
38 column,
39 }
40 }
41
42 pub fn merge(a: Span, b: Span) -> Span {
44 Span {
45 start: a.start,
46 end: b.end,
47 line: a.line,
48 column: a.column,
49 }
50 }
51
52 pub fn dummy() -> Self {
54 Self {
55 start: 0,
56 end: 0,
57 line: 0,
58 column: 0,
59 }
60 }
61}
62
63impl fmt::Display for Span {
64 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
65 write!(f, "{}:{}", self.line, self.column)
66 }
67}
68
69#[derive(Debug, Clone, PartialEq)]
71pub enum TokenKind {
72 Pipeline,
74 Extends,
75 Override,
76 Let,
77 Var,
78 If,
79 Else,
80 For,
81 In,
82 Match,
83 Retry,
84 Parallel,
85 ParallelMap,
86 Return,
87 Import,
88 True,
89 False,
90 Nil,
91 Try,
92 Catch,
93 Throw,
94 Fn,
95 Spawn,
96 While,
97 TypeKw,
98 Enum,
99 Struct,
100 Interface,
101 Pub,
102 From,
103 Thru,
104 Upto,
105 Guard,
106 Ask,
107 Deadline,
108 Yield,
109 Mutex,
110 Break,
111 Continue,
112
113 Identifier(String),
115 StringLiteral(String),
116 InterpolatedString(Vec<StringSegment>),
117 IntLiteral(i64),
118 FloatLiteral(f64),
119 DurationLiteral(u64),
121
122 Eq, Neq, And, Or, Pipe, NilCoal, Arrow, Lte, Gte, PlusAssign, MinusAssign, StarAssign, SlashAssign, PercentAssign, Assign, Not, Dot, Plus, Minus, Star, Slash, Percent, Lt, Gt, Question, Bar, LBrace, RBrace, LParen, RParen, LBracket, RBracket, Comma, Colon, Semicolon, LineComment(String), BlockComment(String), Newline,
169 Eof,
170}
171
172impl fmt::Display for TokenKind {
173 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
174 match self {
175 TokenKind::Pipeline => write!(f, "pipeline"),
176 TokenKind::Extends => write!(f, "extends"),
177 TokenKind::Override => write!(f, "override"),
178 TokenKind::Let => write!(f, "let"),
179 TokenKind::Var => write!(f, "var"),
180 TokenKind::If => write!(f, "if"),
181 TokenKind::Else => write!(f, "else"),
182 TokenKind::For => write!(f, "for"),
183 TokenKind::In => write!(f, "in"),
184 TokenKind::Match => write!(f, "match"),
185 TokenKind::Retry => write!(f, "retry"),
186 TokenKind::Parallel => write!(f, "parallel"),
187 TokenKind::ParallelMap => write!(f, "parallel_map"),
188 TokenKind::Return => write!(f, "return"),
189 TokenKind::Import => write!(f, "import"),
190 TokenKind::True => write!(f, "true"),
191 TokenKind::False => write!(f, "false"),
192 TokenKind::Nil => write!(f, "nil"),
193 TokenKind::Try => write!(f, "try"),
194 TokenKind::Catch => write!(f, "catch"),
195 TokenKind::Throw => write!(f, "throw"),
196 TokenKind::Fn => write!(f, "fn"),
197 TokenKind::Spawn => write!(f, "spawn"),
198 TokenKind::While => write!(f, "while"),
199 TokenKind::TypeKw => write!(f, "type"),
200 TokenKind::Enum => write!(f, "enum"),
201 TokenKind::Struct => write!(f, "struct"),
202 TokenKind::Interface => write!(f, "interface"),
203 TokenKind::Pub => write!(f, "pub"),
204 TokenKind::From => write!(f, "from"),
205 TokenKind::Thru => write!(f, "thru"),
206 TokenKind::Upto => write!(f, "upto"),
207 TokenKind::Guard => write!(f, "guard"),
208 TokenKind::Ask => write!(f, "ask"),
209 TokenKind::Deadline => write!(f, "deadline"),
210 TokenKind::Yield => write!(f, "yield"),
211 TokenKind::Mutex => write!(f, "mutex"),
212 TokenKind::Break => write!(f, "break"),
213 TokenKind::Continue => write!(f, "continue"),
214 TokenKind::Identifier(s) => write!(f, "id({s})"),
215 TokenKind::StringLiteral(s) => write!(f, "str({s})"),
216 TokenKind::InterpolatedString(_) => write!(f, "istr(...)"),
217 TokenKind::IntLiteral(n) => write!(f, "int({n})"),
218 TokenKind::FloatLiteral(n) => write!(f, "float({n})"),
219 TokenKind::DurationLiteral(ms) => write!(f, "duration({ms}ms)"),
220 TokenKind::Eq => write!(f, "=="),
221 TokenKind::Neq => write!(f, "!="),
222 TokenKind::And => write!(f, "&&"),
223 TokenKind::Or => write!(f, "||"),
224 TokenKind::Pipe => write!(f, "|>"),
225 TokenKind::NilCoal => write!(f, "??"),
226 TokenKind::Arrow => write!(f, "->"),
227 TokenKind::Lte => write!(f, "<="),
228 TokenKind::Gte => write!(f, ">="),
229 TokenKind::PlusAssign => write!(f, "+="),
230 TokenKind::MinusAssign => write!(f, "-="),
231 TokenKind::StarAssign => write!(f, "*="),
232 TokenKind::SlashAssign => write!(f, "/="),
233 TokenKind::PercentAssign => write!(f, "%="),
234 TokenKind::Assign => write!(f, "="),
235 TokenKind::Not => write!(f, "!"),
236 TokenKind::Dot => write!(f, "."),
237 TokenKind::Plus => write!(f, "+"),
238 TokenKind::Minus => write!(f, "-"),
239 TokenKind::Star => write!(f, "*"),
240 TokenKind::Slash => write!(f, "/"),
241 TokenKind::Percent => write!(f, "%"),
242 TokenKind::Lt => write!(f, "<"),
243 TokenKind::Gt => write!(f, ">"),
244 TokenKind::Question => write!(f, "?"),
245 TokenKind::Bar => write!(f, "|"),
246 TokenKind::LBrace => write!(f, "{{"),
247 TokenKind::RBrace => write!(f, "}}"),
248 TokenKind::LParen => write!(f, "("),
249 TokenKind::RParen => write!(f, ")"),
250 TokenKind::LBracket => write!(f, "["),
251 TokenKind::RBracket => write!(f, "]"),
252 TokenKind::Comma => write!(f, ","),
253 TokenKind::Colon => write!(f, ":"),
254 TokenKind::Semicolon => write!(f, ";"),
255 TokenKind::LineComment(s) => write!(f, "// {s}"),
256 TokenKind::BlockComment(s) => write!(f, "/* {s} */"),
257 TokenKind::Newline => write!(f, "\\n"),
258 TokenKind::Eof => write!(f, "EOF"),
259 }
260 }
261}
262
263#[derive(Debug, Clone, PartialEq)]
265pub struct Token {
266 pub kind: TokenKind,
267 pub span: Span,
268}
269
270impl Token {
271 pub fn with_span(kind: TokenKind, span: Span) -> Self {
272 Self { kind, span }
273 }
274}