use std::sync::Arc;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum CmpOp {
Eq,
Ne,
Lt,
Le,
Gt,
Ge,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum BinOp {
Add,
Sub,
Mul,
Div,
Mod,
And,
Or,
Alt,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum AssignOp {
Set,
Update,
}
#[derive(Debug, Clone)]
pub enum Literal {
Null,
Bool(bool),
Number(f64),
String(Arc<str>),
}
#[derive(Debug, Clone)]
pub enum Expr {
Identity,
RecurseAll,
Field(Arc<str>),
Index(Box<Expr>),
Slice(Option<Box<Expr>>, Option<Box<Expr>>),
Iterate,
Pipe(Box<Expr>, Box<Expr>),
Comma(Box<Expr>, Box<Expr>),
Lit(Literal),
ArrayCtor(Box<Expr>),
ObjectCtor(Vec<(ObjKey, Expr)>),
Cmp(Box<Expr>, CmpOp, Box<Expr>),
Bin(Box<Expr>, BinOp, Box<Expr>),
Neg(Box<Expr>),
Not(Box<Expr>),
If {
branches: Vec<(Expr, Expr)>,
else_branch: Option<Box<Expr>>,
},
Var(Arc<str>),
Call {
name: Arc<str>,
args: Vec<Expr>,
},
Try(Box<Expr>),
Assign(Box<Expr>, AssignOp, Box<Expr>),
As {
bind: Box<Expr>,
name: Arc<str>,
body: Box<Expr>,
},
Reduce {
source: Box<Expr>,
var: Arc<str>,
init: Box<Expr>,
update: Box<Expr>,
},
Foreach {
source: Box<Expr>,
var: Arc<str>,
init: Box<Expr>,
update: Box<Expr>,
extract: Box<Expr>,
},
Def {
name: Arc<str>,
params: Vec<Arc<str>>,
body: Box<Expr>,
rest: Box<Expr>,
},
}
#[derive(Debug, Clone)]
pub enum ObjKey {
Ident(Arc<str>),
Str(Arc<str>),
Expr(Expr),
}