-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathRuleParser.php
More file actions
69 lines (57 loc) · 2.05 KB
/
RuleParser.php
File metadata and controls
69 lines (57 loc) · 2.05 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
<?php
// SPDX-FileCopyrightText: 2026 Icinga GmbH <https://icinga.com>
// SPDX-License-Identifier: GPL-3.0-or-later
namespace Icinga\Module\Notifications\Util;
use ipl\Stdlib\Filter;
class RuleParser
{
public function parseJson(string $json): Filter\Rule
{
return $this->parseRule(json_decode($json, true));
}
/**
* Parse a serialized rule
*
* @param array $rule A rule serialized as json
*
* @return Filter\Rule
*/
public function parseRule(array $rule): Filter\Rule
{
if (in_array($rule['op'], ['&', '|', '!'])) {
return $this->parseChain($rule);
} else {
return $this->parseCondition($rule);
}
}
protected function parseChain(array $data): Filter\Chain
{
$rules = [];
foreach ($data['rules'] as $rule) {
$rules[] = $this->parseRule($rule);
}
return match ($data['op']) {
'&' => new Filter\All(...$rules),
'|' => new Filter\Any(...$rules),
'!' => new Filter\None(...$rules),
};
}
protected function parseCondition(array $data): Filter\Condition
{
$condition = match ($data['op']) {
'!~' => new Filter\Unlike($data['columnName'], $data['value']),
'!=' => new Filter\Unequal($data['columnName'], $data['value']),
'~' => new Filter\Like($data['columnName'], $data['value']),
'=' => new Filter\Equal($data['columnName'], $data['value']),
'>' => new Filter\GreaterThan($data['columnName'], $data['value']),
'<' => new Filter\LessThan($data['columnName'], $data['value']),
'>=' => new Filter\GreaterThanOrEqual($data['columnName'], $data['value']),
'<=' => new Filter\LessThanOrEqual($data['columnName'], $data['value']),
};
$condition->metaData()->set('jsonPath', $data['column']);
foreach ($data['metadata'] ?? [] as $key => $value) {
$condition->metaData()->set($key, $value);
}
return $condition;
}
}