darklua_core/nodes/expressions/
if_expression.rs1use 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}