dcc-decoder
Version:
<img alttext="COVID Green Logo" src="https://raw.githubusercontent.com/lfph/artwork/master/projects/covidgreen/stacked/color/covidgreen-stacked-color.png" width="300" />
56 lines (46 loc) • 1.21 kB
text/typescript
import { evaluate } from 'certlogic-js'
import {
Rule,
RuleEvaluationDataContext,
RuleEvaluationResult,
RuleSet,
RuleSetEvaluationResult,
} from './types'
export const runRule = (
rule: Rule,
data: RuleEvaluationDataContext
): RuleEvaluationResult => {
try {
const evalResult = evaluate(rule.Logic, data)
if (typeof evalResult === 'boolean') {
return evalResult
}
return new Error(
`rule evaluated to a non-boolean: ${JSON.stringify(evalResult)}`
)
} catch (e) {
return new Error(`rule evaluation errored out: ${e.message}`)
}
}
export const runRuleSet = (
ruleSet: RuleSet,
data: RuleEvaluationDataContext
): RuleSetEvaluationResult => {
const ruleEvaluations: { [ruleId: string]: RuleEvaluationResult } = {}
ruleSet.forEach(rule => {
ruleEvaluations[rule.Identifier] = runRule(rule, data)
})
const hasErrors = Object.values(ruleEvaluations).some(
ruleResult => typeof ruleResult !== 'boolean'
)
const allSatisfied =
!hasErrors &&
Object.values(ruleEvaluations)
.map(ruleResult => ruleResult as boolean)
.reduce((l, r) => l && r)
return {
ruleEvaluations,
hasErrors,
allSatisfied,
}
}