use super::{Block, PartialNode, Spanned, Statement, TypeExpr};
#[derive(Clone, Debug, PartialEq)]
pub enum Expr {
Literal(Literal),
Idiom(Idiom),
Param(String),
Table(Spanned<String>),
RecordId {
table: Spanned<String>,
id: crate::span::ByteRange,
range: bool,
},
Binary {
lhs: Box<Spanned<Expr>>,
op: Spanned<BinaryOp>,
rhs: Box<Spanned<Expr>>,
},
Prefix {
op: Spanned<PrefixOp>,
expr: Box<Spanned<Expr>>,
},
Call(Call),
Object(Vec<(Spanned<String>, Spanned<Expr>)>),
Array(Vec<Spanned<Expr>>),
Subquery(Box<Spanned<Statement>>),
Block(Block),
Cast {
ty: Spanned<TypeExpr>,
expr: Box<Spanned<Expr>>,
},
Closure(Closure),
Partial(PartialNode),
}
#[derive(Clone, Debug, PartialEq)]
pub struct Closure {
pub params: Vec<(Spanned<String>, Option<Spanned<TypeExpr>>)>,
pub return_ty: Option<Spanned<TypeExpr>>,
pub body: Box<Spanned<Expr>>,
}
#[derive(Clone, Debug, PartialEq)]
pub enum Literal {
Int(i64),
Float(f64),
Decimal,
String(String),
Bool(bool),
None,
Null,
Duration(String),
Datetime(String),
Uuid(String),
Regex(String),
}
#[derive(Clone, Debug, PartialEq)]
pub struct Idiom {
pub parts: Vec<Spanned<IdiomPart>>,
}
#[derive(Clone, Debug, PartialEq)]
pub enum IdiomPart {
Start(Box<Spanned<Expr>>),
Field(String),
Index(Box<Spanned<Expr>>),
All,
Last,
Graph {
dir: Spanned<GraphDir>,
step: GraphStep,
},
Destructure(Vec<Spanned<Idiom>>),
Where(Box<Spanned<Expr>>),
Method {
name: Spanned<String>,
args: Vec<Spanned<Expr>>,
},
Recurse {
bounded: bool,
},
Optional,
Partial(PartialNode),
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum GraphDir {
Out,
In,
Both,
}
#[derive(Clone, Debug, PartialEq)]
pub struct GraphStep {
pub targets: Vec<Spanned<String>>,
pub where_clause: Option<Box<Spanned<Expr>>>,
pub reference: bool,
}
#[derive(Clone, Debug, PartialEq)]
pub struct Call {
pub path: Spanned<String>,
pub args: Vec<Spanned<Expr>>,
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub enum BinaryOp {
Add,
Sub,
Mul,
Div,
Eq,
NotEq,
Lt,
LtEq,
Gt,
GtEq,
And,
Or,
NullCoalesce,
Other(String),
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub enum PrefixOp {
Not,
Neg,
Pos,
Other(String),
}