1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
use serde::{Deserialize, Serialize};
use crate::types::CelBytes;
#[allow(dead_code)]
#[derive(Debug, Clone, PartialEq)]
pub enum Token {
Question, // ?
Colon, // :
Add, // +
Minus, // -
Multiply, // *
Divide, // /
Mod, // %
Not, // !
Dot, // .
Comma, // ,
LBracket, // [
RBracket, // ]
LBrace, // {
RBrace, // }
LParen, // (
RParen, // )
LessThan, // <
GreaterThan, // >
OrOr, // ||
AndAnd, // &&
LessEqual, // <=
GreaterEqual, // >=
EqualEqual, // ==
NotEqual, // !=
In, // 'in'
Null, // 'null'
Match, // 'match'
Case, // 'case'
BoolLit(bool), // true | false
IntLit(u64), // [-+]?[0-9]+
UIntLit(u64), // [0-9]+u
FloatLit(f64), // [-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?
StringLit(String), // r?('|")[^\n]*('|")
FStringLit(Vec<FStringSegment>), // f'.*'
ByteStringLit(CelBytes), // b('|")[^\n]('|")
Ident(String), // [_A-Za-z][_A-Za-z0-9]*
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub enum FStringSegment {
Lit(String),
Expr(String),
}
pub trait AsToken {
fn as_token(&self) -> Option<&Token>;
}
pub trait IntoToken {
fn into_token(self) -> Option<Token>;
}