use super::{Identifier, Statement};
use crate::{BinaryOperator, UnaryOperator, Value};
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[non_exhaustive]
pub enum Expression {
Literal(Value),
Variable(Identifier),
Unary(UnaryExpression),
Binary(BinaryExpression),
Call(CallExpression),
#[cfg(feature = "method_call_expression")]
MethodCall(MethodCallExpression),
#[cfg(feature = "if_expression")]
If(IfExpression),
Block(BlockExpression),
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[non_exhaustive]
pub struct UnaryExpression {
pub operator: UnaryOperator,
pub operand: Box<Expression>,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[non_exhaustive]
pub struct BinaryExpression {
pub left: Box<Expression>,
pub operator: BinaryOperator,
pub right: Box<Expression>,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[non_exhaustive]
pub struct CallExpression {
pub identifier: Identifier,
pub arguments: Vec<Expression>,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[cfg(feature = "method_call_expression")]
#[non_exhaustive]
pub struct MethodCallExpression {
pub receiver: Box<Expression>,
pub identifier: Identifier,
pub arguments: Vec<Expression>,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[cfg(feature = "if_expression")]
#[non_exhaustive]
pub struct IfExpression {
pub condition: Box<Expression>,
pub then_branch: BlockExpression,
pub else_branch: Option<BlockExpression>,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[non_exhaustive]
pub struct BlockExpression {
pub statements: Vec<Statement>,
pub value: Option<Box<Expression>>,
}