darklua_core/nodes/expressions/
if_expression.rs

1use crate::nodes::Token;
2
3use super::Expression;
4
5#[derive(Clone, Debug, PartialEq, Eq)]
6pub struct IfExpression {
7    condition: Expression,
8    result: Expression,
9    else_result: Expression,
10    branches: Vec<ElseIfExpressionBranch>,
11    tokens: Option<IfExpressionTokens>,
12}
13
14impl IfExpression {
15    pub fn new<E: Into<Expression>, E2: Into<Expression>, E3: Into<Expression>>(
16        condition: E,
17        result: E2,
18        else_result: E3,
19    ) -> Self {
20        Self {
21            condition: condition.into(),
22            result: result.into(),
23            else_result: else_result.into(),
24            branches: Vec::new(),
25            tokens: None,
26        }
27    }
28
29    pub fn with_tokens(mut self, tokens: IfExpressionTokens) -> Self {
30        self.tokens = Some(tokens);
31        self
32    }
33
34    pub fn with_branch<E: Into<Expression>, E2: Into<Expression>>(
35        mut self,
36        condition: E,
37        result: E2,
38    ) -> Self {
39        self.branches
40            .push(ElseIfExpressionBranch::new(condition, result));
41        self
42    }
43
44    #[inline]
45    pub fn push_branch(&mut self, branch: ElseIfExpressionBranch) {
46        self.branches.push(branch);
47    }
48
49    #[inline]
50    pub fn set_tokens(&mut self, tokens: IfExpressionTokens) {
51        self.tokens = Some(tokens);
52    }
53
54    #[inline]
55    pub fn get_tokens(&self) -> Option<&IfExpressionTokens> {
56        self.tokens.as_ref()
57    }
58
59    #[inline]
60    pub fn get_condition(&self) -> &Expression {
61        &self.condition
62    }
63
64    #[inline]
65    pub fn mutate_condition(&mut self) -> &mut Expression {
66        &mut self.condition
67    }
68
69    #[inline]
70    pub fn get_result(&self) -> &Expression {
71        &self.result
72    }
73
74    #[inline]
75    pub fn mutate_result(&mut self) -> &mut Expression {
76        &mut self.result
77    }
78
79    #[inline]
80    pub fn get_else_result(&self) -> &Expression {
81        &self.else_result
82    }
83
84    #[inline]
85    pub fn mutate_else_result(&mut self) -> &mut Expression {
86        &mut self.else_result
87    }
88
89    #[inline]
90    pub fn has_elseif_branch(&self) -> bool {
91        !self.branches.is_empty()
92    }
93
94    #[inline]
95    pub fn iter_branches(&self) -> impl Iterator<Item = &ElseIfExpressionBranch> {
96        self.branches.iter()
97    }
98
99    #[inline]
100    pub fn clear_elseif_branches(&mut self) {
101        self.branches.clear();
102    }
103
104    #[inline]
105    pub fn retain_elseif_branches_mut(
106        &mut self,
107        filter: impl FnMut(&mut ElseIfExpressionBranch) -> bool,
108    ) {
109        self.branches.retain_mut(filter);
110    }
111
112    pub fn remove_branch(&mut self, index: usize) -> Option<ElseIfExpressionBranch> {
113        if index < self.branches.len() {
114            Some(self.branches.remove(index))
115        } else {
116            None
117        }
118    }
119
120    #[inline]
121    pub fn iter_mut_branches(&mut self) -> impl Iterator<Item = &mut ElseIfExpressionBranch> {
122        self.branches.iter_mut()
123    }
124
125    super::impl_token_fns!(iter = [tokens, branches]);
126}
127
128#[derive(Clone, Debug, PartialEq, Eq)]
129pub struct ElseIfExpressionBranch {
130    condition: Expression,
131    result: Expression,
132    tokens: Option<ElseIfExpressionBranchTokens>,
133}
134
135impl ElseIfExpressionBranch {
136    pub fn new<E: Into<Expression>, E2: Into<Expression>>(condition: E, result: E2) -> Self {
137        Self {
138            condition: condition.into(),
139            result: result.into(),
140            tokens: None,
141        }
142    }
143
144    #[inline]
145    pub fn set_tokens(&mut self, tokens: ElseIfExpressionBranchTokens) {
146        self.tokens = Some(tokens);
147    }
148
149    #[inline]
150    pub fn get_tokens(&self) -> Option<&ElseIfExpressionBranchTokens> {
151        self.tokens.as_ref()
152    }
153
154    #[inline]
155    pub fn get_condition(&self) -> &Expression {
156        &self.condition
157    }
158
159    #[inline]
160    pub fn mutate_condition(&mut self) -> &mut Expression {
161        &mut self.condition
162    }
163
164    #[inline]
165    pub fn get_result(&self) -> &Expression {
166        &self.result
167    }
168
169    #[inline]
170    pub fn mutate_result(&mut self) -> &mut Expression {
171        &mut self.result
172    }
173
174    pub fn into_expressions(self) -> (Expression, Expression) {
175        (self.condition, self.result)
176    }
177
178    super::impl_token_fns!(iter = [tokens]);
179}
180
181#[derive(Clone, Debug, PartialEq, Eq)]
182pub struct IfExpressionTokens {
183    pub r#if: Token,
184    pub then: Token,
185    pub r#else: Token,
186}
187
188impl IfExpressionTokens {
189    super::impl_token_fns!(target = [r#if, then, r#else]);
190}
191
192#[derive(Clone, Debug, PartialEq, Eq)]
193pub struct ElseIfExpressionBranchTokens {
194    pub elseif: Token,
195    pub then: Token,
196}
197
198impl ElseIfExpressionBranchTokens {
199    super::impl_token_fns!(target = [elseif, then]);
200}