1use serde::Serialize;
2
3use super::*;
4
5#[derive(Debug, Clone, Serialize)]
6pub enum BinaryOp {
7 Plus,
8 Minus,
9 Multiply,
10 Divide,
11 Modulo,
12 Equal,
13 NotEqual,
14 LessThan,
15 GreaterThan,
16 LessThanOrEqual,
17 GreaterThanOrEqual,
18 And,
19 Or,
20 ShiftLeft,
21 ShiftRight,
22 RangeInclusive,
23 RangeExclusive,
24 BitAnd,
25 BitOr,
26 BitXor,
27}
28
29#[derive(Debug, Clone, Serialize)]
30pub enum Expression {
31 Literal(Literal),
32 Path(ExprPath),
33 Fix {
34 initial: Box<Expression>,
35 prefixes: Vec<Prefix>,
36 postfixes: Vec<Postfix>,
37 },
38 Binary {
39 lhs: Box<Expression>,
40 op: BinaryOp,
41 rhs: Box<Expression>,
42 },
43}
44
45#[derive(Debug, Clone, Serialize)]
46pub enum Literal {
47 String(String),
48 Int(i64),
49 Float(f64),
50 Bool(bool),
51 Tuple(Vec<Expression>),
52 Array(Vec<Expression>),
53 ArrayRepeat(Box<Expression>, Box<Expression>),
54}
55
56#[derive(Debug, Clone, Serialize)]
57pub enum Pattern {
58 NamedTuple(Path, Vec<Identifier>),
59 Struct(Path, Vec<Identifier>),
60 Tuple(Vec<Identifier>),
61 Literal(Literal),
62 Path(Path),
63 Id(Identifier),
64}
65
66#[derive(Debug, Clone, Serialize)]
67pub enum Postfix {
68 FieldAccess(Identifier, Option<Generics>),
69 Call(Vec<Expression>),
70 MacroCall(String),
71 StructCall(Vec<(Identifier, Expression)>),
72 Index(Expression),
73 As(TypeExpr),
74 Try,
75}
76
77#[derive(Debug, Clone, Serialize)]
78pub enum Prefix {
79 Ref,
80 RefMut,
81 Deref,
82 New(Option<Generics>),
83 Not,
84 Neg,
85}
86
87#[derive(Debug, Clone, Serialize)]
88pub struct ExprPathSegment {
89 pub ident: Identifier,
90 pub generics: Option<Generics>,
91}
92
93#[derive(Debug, Clone, Serialize)]
94pub struct ExprPath(pub Vec<ExprPathSegment>);
95
96#[derive(Debug, Clone, Serialize)]
97pub struct Generics(pub Vec<Generic>);
98
99#[derive(Debug, Clone, Serialize)]
100pub enum Generic {
101 Lifetime(Identifier),
102 Type(TypeExpr),
103}