|
2 | 2 |
|
3 | 3 | import re |
4 | 4 | from collections.abc import Callable |
5 | | -from enum import Enum, unique |
| 5 | +from enum import StrEnum, unique |
6 | 6 | from typing import Any |
7 | 7 |
|
8 | 8 | from src.api import utils |
|
13 | 13 |
|
14 | 14 |
|
15 | 15 | @unique |
16 | | -class FN(str, Enum): |
| 16 | +class FN(StrEnum): |
17 | 17 | OP_NOT = "!" |
18 | 18 | OP_PLUS = "+" |
19 | 19 | OP_EQ = "==" |
@@ -215,28 +215,31 @@ def eval(self, vars_: dict[str, Any] | None = None) -> str | Evaluator | list[An |
215 | 215 | val = self.expression[0] |
216 | 216 | if not isinstance(val, str): |
217 | 217 | return val |
| 218 | + |
218 | 219 | if val == "$": |
219 | 220 | return val |
| 221 | + |
220 | 222 | if not RE_SVAR.match(val): |
221 | 223 | return val |
| 224 | + |
222 | 225 | if val not in vars_: |
223 | 226 | raise UnboundVarError(f"Unbound variable '{val}'") |
| 227 | + |
224 | 228 | return vars_[val] |
225 | 229 |
|
226 | 230 | if len(self.expression) == 2: |
227 | | - oper = self.expression[0] |
| 231 | + oper = FN(self.expression[0]) |
228 | 232 | assert oper in UNARY |
229 | 233 | operand = self.expression[1].eval(vars_) |
230 | | - # FIXME |
231 | | - return self.normalize(UNARY[oper](operand)) # type: ignore[index] |
| 234 | + return self.normalize(UNARY[oper](operand)) |
232 | 235 |
|
233 | 236 | if len(self.expression) == 3 and self.expression[1] != FN.OP_COMMA: |
234 | | - assert self.expression[1] in BINARY |
| 237 | + oper = FN(self.expression[1]) |
| 238 | + assert oper in BINARY |
235 | 239 | # Do lazy evaluation |
236 | 240 | left_ = lambda: self.expression[0].eval(vars_) |
237 | 241 | right_ = lambda: self.expression[2].eval(vars_) |
238 | | - # FIXME |
239 | | - return self.normalize(BINARY[self.expression[1]](left_, right_)) # type: ignore[index] |
| 242 | + return self.normalize(BINARY[oper](left_, right_)) |
240 | 243 |
|
241 | 244 | # It's a list |
242 | 245 | return [x.eval(vars_) for i, x in enumerate(self.expression) if not i % 2] |
|
0 commit comments