1use serde::Serialize;
2
3use super::*;
4
5#[derive(Debug, Clone, Serialize)]
6pub enum Expression {
7 Literal(Literal),
8 Path(ExprPath),
9 Statement(Box<Statement>),
10 Fix {
11 initial: Box<Expression>,
12 prefixes: Vec<Prefix>,
13 postfixes: Vec<Postfix>,
14 },
15 Binary {
16 lhs: Box<Expression>,
17 op: String,
18 rhs: Box<Expression>,
19 },
20}
21
22#[derive(Debug, Clone, Serialize)]
23pub enum Literal {
24 String(String),
25 Int(i64),
26 Float(f64),
27 Bool(bool),
28 Tuple(Vec<Expression>),
29 Array(Vec<Expression>),
30 ArrayRepeat(Box<Expression>, Box<Expression>),
31}
32
33#[derive(Debug, Clone, Serialize)]
34pub enum Pattern {
35 NamedTuple(Path, Vec<Box<Pattern>>),
36 Struct(Path, Vec<Box<Pattern>>),
37 Tuple(Vec<Box<Pattern>>),
38 Literal(Literal),
39 Path(bool, Path),
40}
41
42#[derive(Debug, Clone, Serialize)]
43pub enum MacroDelimiter {
44 Paren,
45 Bracket,
46 Brace,
47}
48
49#[derive(Debug, Clone, Serialize)]
50pub enum Postfix {
51 FieldAccess(Identifier, Option<Generics>),
52 Call(Vec<Expression>),
53 MacroCall {
54 inner: String,
55 delimiter: MacroDelimiter,
56 },
57 StructCall(Vec<(Identifier, Expression)>),
58 Assign(String, Box<Expression>),
59 Index(Expression),
60 As(TypeExpr),
61 Increment,
62 Decrement,
63 Try,
64}
65
66#[derive(Debug, Clone, Serialize)]
67pub enum Prefix {
68 Ref,
69 RefMut,
70 Deref,
71 Not,
72 Neg,
73 Closure(Option<TypeExpr>, Vec<VarDecl>),
74}
75
76#[derive(Debug, Clone, Serialize)]
77pub struct ExprPathSegment {
78 pub ident: Identifier,
79 pub generics: Option<Generics>,
80}
81
82#[derive(Debug, Clone, Serialize)]
83pub struct ExprPath(pub Vec<ExprPathSegment>);
84
85#[derive(Debug, Clone, Serialize)]
86pub struct Generics(pub Vec<Generic>);
87
88#[derive(Debug, Clone, Serialize)]
89pub enum Generic {
90 Lifetime(Identifier),
91 Type(TypeExpr),
92}
93
94impl Expression {
95 pub fn is_block(&self) -> bool {
96 if let Expression::Statement(stmt) = self {
97 stmt.is_block()
98 } else {
99 false
100 }
101 }
102}
103
104impl From<Path> for ExprPath {
105 fn from(path: Path) -> Self {
106 Self(
107 path.0
108 .into_iter()
109 .map(|v| ExprPathSegment {
110 ident: v,
111 generics: None,
112 })
113 .collect(),
114 )
115 }
116}