use super::operators::{BinaryOp, UnaryOp};
use super::span::Span;
use super::stmt::Stmt;
use crate::value::AttributePathSegment;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ObjectProperty {
pub key: String,
pub value: Expr,
pub span: Span,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum Expr {
Literal {
value: LiteralValue,
span: Span,
},
Variable {
name: String,
path: Vec<AttributePathSegment>,
span: Span,
},
LastValue {
span: Span,
},
Binary {
op: BinaryOp,
left: Box<Expr>,
right: Box<Expr>,
span: Span,
},
Unary {
op: UnaryOp,
argument: Box<Expr>,
span: Span,
},
Call {
callee: String,
args: Vec<Expr>,
span: Span,
},
ObjectLiteral {
properties: Vec<ObjectProperty>,
span: Span,
},
ArrayLiteral {
elements: Vec<Expr>,
span: Span,
},
Subexpression {
body: Vec<Stmt>,
span: Span,
},
TemplateLiteral {
raw: String,
span: Span,
},
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum LiteralValue {
Null,
Bool(bool),
Number(f64),
String(String),
}
impl Expr {
pub fn span(&self) -> &Span {
match self {
Expr::Literal { span, .. }
| Expr::Variable { span, .. }
| Expr::LastValue { span }
| Expr::Binary { span, .. }
| Expr::Unary { span, .. }
| Expr::Call { span, .. }
| Expr::ObjectLiteral { span, .. }
| Expr::ArrayLiteral { span, .. }
| Expr::Subexpression { span, .. }
| Expr::TemplateLiteral { span, .. } => span,
}
}
}