#![allow(clippy::missing_const_for_fn)]
use alloc::boxed::Box;
use alloc::string::String;
use alloc::vec::Vec;
use serde::{Deserialize, Serialize};
use super::literals::{
BooleanLiteral, DateTimeLiteral, NullLiteral, NumberLiteral, StringLiteral, TimeLiteral,
};
use super::operators::{ArrayOperator, ConditionOperator};
use super::references::AttributeReference;
use super::span::EmptySpan;
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct ConditionExpression {
#[serde(skip)]
pub span: EmptySpan,
pub raw_expression: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub expression: Option<ConditionExpr>,
}
impl ConditionExpression {
pub fn new(span: EmptySpan, expression: String) -> Self {
Self {
span,
raw_expression: expression,
expression: None,
}
}
pub fn with_parsed(span: EmptySpan, raw_expression: String, parsed: ConditionExpr) -> Self {
Self {
span,
raw_expression,
expression: Some(parsed),
}
}
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(tag = "type")]
pub enum ConditionExpr {
Logical(LogicalExpression),
Unary(UnaryExpression),
Binary(BinaryExpression),
FunctionCall(FunctionCallExpression),
AttributeReference(AttributeReference),
ArrayExpression(ArrayExpression),
Identifier(IdentifierExpression),
VariableReference(VariableReference),
PropertyAccess(PropertyAccessExpression),
StringLiteral(StringLiteral),
NumberLiteral(NumberLiteral),
BooleanLiteral(BooleanLiteral),
NullLiteral(NullLiteral),
DateTimeLiteral(DateTimeLiteral),
TimeLiteral(TimeLiteral),
SetLiteral(SetLiteral),
ListLiteral(ListLiteral),
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct LogicalExpression {
#[serde(skip)]
pub span: EmptySpan,
pub operator: LogicalOperator,
pub left: Box<ConditionExpr>,
pub right: Box<ConditionExpr>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub enum LogicalOperator {
And,
Or,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct UnaryExpression {
#[serde(skip)]
pub span: EmptySpan,
pub operator: UnaryOperator,
pub operand: Box<ConditionExpr>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub enum UnaryOperator {
Not,
Exists,
NotExists,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct BinaryExpression {
#[serde(skip)]
pub span: EmptySpan,
pub operator: ConditionOperator,
pub left: Box<ConditionExpr>,
pub right: Box<ConditionExpr>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct FunctionCallExpression {
#[serde(skip)]
pub span: EmptySpan,
pub function: String,
pub arguments: Vec<ConditionExpr>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct ArrayExpression {
#[serde(skip)]
pub span: EmptySpan,
pub operator: ArrayOperator,
pub array: Box<ConditionExpr>,
#[serde(skip_serializing_if = "Option::is_none")]
pub variable: Option<String>,
pub condition: Box<ConditionExpr>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct SetLiteral {
#[serde(skip)]
pub span: EmptySpan,
pub elements: Vec<ConditionExpr>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct ListLiteral {
#[serde(skip)]
pub span: EmptySpan,
pub elements: Vec<ConditionExpr>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct IdentifierExpression {
#[serde(skip)]
pub span: EmptySpan,
pub name: String,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct VariableReference {
#[serde(skip)]
pub span: EmptySpan,
pub name: String,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct PropertyAccessExpression {
#[serde(skip)]
pub span: EmptySpan,
pub object: Box<ConditionExpr>,
pub property: String,
}