use schemars::JsonSchema;
use serde::Deserialize;
use serde::Serialize;
use crate::lexer::token::Span;
use crate::node::Node;
use crate::parser::ast::Ending;
use crate::parser::ast::Expression;
use crate::parser::ast::Statement;
#[derive(Debug, PartialEq, Eq, Clone, Deserialize, Serialize, JsonSchema)]
pub struct IfStatement {
pub r#if: Span, pub left_parenthesis: Span, pub condition: Expression, pub right_parenthesis: Span, pub body: IfStatementBody, }
impl Node for IfStatement {
fn children(&mut self) -> Vec<&mut dyn Node> {
vec![&mut self.condition, &mut self.body]
}
}
#[derive(Debug, PartialEq, Eq, Clone, Deserialize, Serialize, JsonSchema)]
#[serde(tag = "type", content = "value")]
pub enum IfStatementBody {
Statement {
statement: Box<Statement>, elseifs: Vec<IfStatementElseIf>, r#else: Option<IfStatementElse>, },
Block {
colon: Span, statements: Vec<Statement>, elseifs: Vec<IfStatementElseIfBlock>, r#else: Option<IfStatementElseBlock>, endif: Span, ending: Ending, },
}
impl Node for IfStatementBody {
fn children(&mut self) -> Vec<&mut dyn Node> {
match self {
IfStatementBody::Statement {
statement,
elseifs,
r#else,
} => {
let mut children: Vec<&mut dyn Node> = vec![statement.as_mut()];
children.extend(
elseifs
.iter_mut()
.map(|elseif| elseif as &mut dyn Node)
.collect::<Vec<&mut dyn Node>>(),
);
if let Some(r#else) = r#else {
children.push(r#else as &mut dyn Node);
}
children
}
IfStatementBody::Block {
statements,
elseifs,
r#else,
..
} => {
let mut children: Vec<&mut dyn Node> = vec![];
children.extend(
statements
.iter_mut()
.map(|statement| statement as &mut dyn Node),
);
children.extend(elseifs.iter_mut().map(|elseif| elseif as &mut dyn Node));
if let Some(r#else) = r#else {
children.push(r#else as &mut dyn Node);
}
children
}
}
}
}
#[derive(Debug, PartialEq, Eq, Clone, Deserialize, Serialize, JsonSchema)]
pub struct IfStatementElseIf {
pub elseif: Span, pub left_parenthesis: Span, pub condition: Expression, pub right_parenthesis: Span, pub statement: Box<Statement>, }
impl Node for IfStatementElseIf {
fn children(&mut self) -> Vec<&mut dyn Node> {
vec![&mut self.condition, self.statement.as_mut()]
}
}
#[derive(Debug, PartialEq, Eq, Clone, Deserialize, Serialize, JsonSchema)]
pub struct IfStatementElse {
pub r#else: Span, pub statement: Box<Statement>, }
impl Node for IfStatementElse {
fn children(&mut self) -> Vec<&mut dyn Node> {
vec![self.statement.as_mut()]
}
}
#[derive(Debug, PartialEq, Eq, Clone, Deserialize, Serialize, JsonSchema)]
pub struct IfStatementElseIfBlock {
pub elseif: Span, pub left_parenthesis: Span, pub condition: Expression, pub right_parenthesis: Span, pub colon: Span, pub statements: Vec<Statement>, }
impl Node for IfStatementElseIfBlock {
fn children(&mut self) -> Vec<&mut dyn Node> {
let mut children: Vec<&mut dyn Node> = vec![&mut self.condition];
children.extend(
self.statements
.iter_mut()
.map(|statement| statement as &mut dyn Node),
);
children
}
}
#[derive(Debug, PartialEq, Eq, Clone, Deserialize, Serialize, JsonSchema)]
pub struct IfStatementElseBlock {
pub r#else: Span, pub colon: Span, pub statements: Vec<Statement>, }
impl Node for IfStatementElseBlock {
fn children(&mut self) -> Vec<&mut dyn Node> {
self.statements
.iter_mut()
.map(|statement| statement as &mut dyn Node)
.collect()
}
}