|
7 | 7 | from generic_k8s_webhook import utils
|
8 | 8 |
|
9 | 9 | GRAMMAR_V1 = r"""
|
10 |
| - ?start: expr |
| 10 | + ?start: expr | list_filter_map |
| 11 | +
|
| 12 | + ?list_filter_map: reference filter_expr -> filterr |
| 13 | + | reference map_expr -> mapp |
| 14 | + | list_filter_map filter_expr -> filterr |
| 15 | + | list_filter_map map_expr -> mapp |
| 16 | +
|
| 17 | + ?filter_expr: "|" expr |
| 18 | +
|
| 19 | + ?map_expr: "->" expr |
11 | 20 |
|
12 | 21 | ?expr: or
|
13 | 22 |
|
|
33 | 42 | | product "*" atom -> mul
|
34 | 43 | | product "/" atom -> div
|
35 | 44 |
|
36 |
| - ?atom: SIGNED_NUMBER -> number |
37 |
| - | ESCAPED_STRING -> const_string |
38 |
| - | REF -> ref |
39 |
| - | BOOL -> boolean |
| 45 | + ?atom: signed_number |
| 46 | + | escaped_string |
| 47 | + | reference |
| 48 | + | bool |
40 | 49 | | "(" expr ")"
|
41 | 50 |
|
| 51 | + signed_number: SIGNED_NUMBER -> number |
| 52 | + escaped_string: ESCAPED_STRING -> const_string |
| 53 | + reference: REF -> ref |
| 54 | + bool: BOOL -> boolean |
| 55 | +
|
42 | 56 | BOOL: "true" | "false"
|
43 | 57 | REF: "$"? ("."(CNAME|"*"|INT))+
|
44 | 58 |
|
@@ -113,6 +127,14 @@ def boolean(self, items):
|
113 | 127 | elem_bool = elem == "true"
|
114 | 128 | return op.Const(elem_bool)
|
115 | 129 |
|
| 130 | + def filterr(self, items): |
| 131 | + elems, operator = items |
| 132 | + return op.Filter(elems, operator) |
| 133 | + |
| 134 | + def mapp(self, items): |
| 135 | + elems, operator = items |
| 136 | + return op.ForEach(elems, operator) |
| 137 | + |
116 | 138 |
|
117 | 139 | def parse_ref(ref: str) -> op.GetValue:
|
118 | 140 | """Parses a string that is a reference to some element within a json payload
|
@@ -186,12 +208,13 @@ def get_transformer(cls) -> Transformer:
|
186 | 208 | def main():
|
187 | 209 | parser = Lark(GRAMMAR_V1)
|
188 | 210 | # print(parser.parse('.key != "some string"').pretty())
|
189 |
| - tree = parser.parse('"true" != "false"') |
| 211 | + tree = parser.parse('.spec.containers | .name != "main" -> .requests.cpu * 0.75') |
190 | 212 | print(tree.pretty())
|
191 | 213 | trans = MyTransformerV1()
|
192 | 214 | new_op = trans.transform(tree)
|
193 | 215 | print(new_op)
|
194 |
| - print(new_op.get_value([])) |
| 216 | + context = {"spec": {"containers": [{"name": "main"}, {"name": "side", "requests": {"cpu": 2}}]}} |
| 217 | + print(new_op.get_value([context])) |
195 | 218 |
|
196 | 219 |
|
197 | 220 | if __name__ == "__main__":
|
|
0 commit comments