use serde::{Deserialize, Serialize};
use super::expressions::Expr;
use super::functions::Annotation;
use super::patterns::{DestructurePattern, Pattern};
use super::program::VariableDecl;
use super::span::Span;
use super::types::TypeAnnotation;
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct BlockExpr {
pub items: Vec<BlockItem>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub enum BlockItem {
VariableDecl(VariableDecl),
Assignment(super::program::Assignment),
Statement(super::statements::Statement),
Expression(Expr),
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct IfExpr {
pub condition: Box<Expr>,
pub then_branch: Box<Expr>,
pub else_branch: Option<Box<Expr>>, }
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct WhileExpr {
pub condition: Box<Expr>,
pub body: Box<Expr>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct ForExpr {
pub pattern: Pattern,
pub iterable: Box<Expr>,
pub body: Box<Expr>,
pub is_async: bool,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct ListComprehension {
pub element: Box<Expr>,
pub clauses: Vec<ComprehensionClause>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct ComprehensionClause {
pub pattern: DestructurePattern,
pub iterable: Box<Expr>,
pub filter: Option<Box<Expr>>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct LoopExpr {
pub body: Box<Expr>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct LetExpr {
pub pattern: Pattern,
pub type_annotation: Option<TypeAnnotation>,
pub value: Option<Box<Expr>>,
pub body: Box<Expr>, }
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct AssignExpr {
pub target: Box<Expr>, pub value: Box<Expr>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct MatchExpr {
pub scrutinee: Box<Expr>,
pub arms: Vec<MatchArm>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct MatchArm {
pub pattern: Pattern,
pub guard: Option<Box<Expr>>,
pub body: Box<Expr>,
pub pattern_span: Option<super::Span>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct FromQueryExpr {
pub variable: String,
pub source: Box<Expr>,
pub clauses: Vec<QueryClause>,
pub select: Box<Expr>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub enum QueryClause {
Where(Box<Expr>),
OrderBy(Vec<OrderBySpec>),
GroupBy {
element: Box<Expr>,
key: Box<Expr>,
into_var: Option<String>,
},
Join {
variable: String,
source: Box<Expr>,
left_key: Box<Expr>,
right_key: Box<Expr>,
into_var: Option<String>,
},
Let { variable: String, value: Box<Expr> },
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct OrderBySpec {
pub key: Box<Expr>,
pub descending: bool,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum JoinKind {
All = 0,
Race = 1,
Any = 2,
Settle = 3,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct JoinBranch {
pub label: Option<String>,
pub expr: Expr,
pub annotations: Vec<Annotation>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct AsyncLetExpr {
pub name: String,
pub expr: Box<Expr>,
pub span: Span,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct JoinExpr {
pub kind: JoinKind,
pub branches: Vec<JoinBranch>,
pub span: Span,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct ComptimeForExpr {
pub variable: String,
pub iterable: Box<Expr>,
pub body: Vec<super::statements::Statement>,
}