Skip to content

Commit b9b51a1

Browse files
author
Marco Franceschi
committed
feat: Created CompositeEvaluator for composite rules
1 parent 5fbb911 commit b9b51a1

File tree

4 files changed

+32
-1
lines changed

4 files changed

+32
-1
lines changed
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import { JsonRule, Result, Rule, RuleFinding } from '../types'
2+
import { RuleEvaluator } from './rule-evaluator'
3+
4+
export default class CompositeEvaluator implements RuleEvaluator<JsonRule> {
5+
canEvaluate(rule: Rule): boolean {
6+
return 'relatedRules' in rule
7+
}
8+
9+
async evaluateSingleResource(rule: Rule): Promise<RuleFinding> {
10+
return {
11+
id: rule.id,
12+
result: Result.SKIPPED,
13+
typename: 'composite',
14+
rule,
15+
} as RuleFinding
16+
}
17+
}

src/rules-engine/evaluators/manual-evaluator.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,12 @@ import { RuleEvaluator } from './rule-evaluator'
33

44
export default class ManualEvaluator implements RuleEvaluator<JsonRule> {
55
canEvaluate(rule: Rule): boolean {
6-
return !('gql' in rule) && !('conditions' in rule) && !('resource' in rule)
6+
return (
7+
!('gql' in rule) &&
8+
!('conditions' in rule) &&
9+
!('resource' in rule) &&
10+
!('relatedRules' in rule)
11+
)
712
}
813

914
async evaluateSingleResource(rule: Rule): Promise<RuleFinding> {

src/rules-engine/index.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import JsonEvaluator from './evaluators/json-evaluator'
66
import ManualEvaluator from './evaluators/manual-evaluator'
77
import JsEvaluator from './evaluators/js-evaluator'
88
import { RuleEvaluator } from './evaluators/rule-evaluator'
9+
import CompositeEvaluator from './evaluators/composite-evaluator'
910
import { Engine, ResourceData, Rule, RuleFinding } from './types'
1011
import { Entity } from '../types'
1112

@@ -14,6 +15,7 @@ export default class RulesProvider implements Engine {
1415
new JsonEvaluator(),
1516
new JsEvaluator(),
1617
new ManualEvaluator(),
18+
new CompositeEvaluator(),
1719
]
1820

1921
private readonly typenameToFieldMap: { [typeName: string]: string }
@@ -310,6 +312,12 @@ export default class RulesProvider implements Engine {
310312
return res
311313
}
312314

315+
if (isEmpty(data) && evaluator instanceof CompositeEvaluator) {
316+
// Returned Composite Rule Response
317+
res.push(await evaluator.evaluateSingleResource(rule))
318+
return res
319+
}
320+
313321
if (!evaluator) {
314322
return []
315323
}

src/rules-engine/types.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ export interface Rule {
5050
severity: Severity
5151
gql: string
5252
resource: string
53+
relatedRules?: string[]
5354
}
5455
export interface RuleFinding {
5556
id: string

0 commit comments

Comments
 (0)