evaluate static method
dynamic
evaluate(
- dynamic expr,
- dynamic data
The evaluate function, this function will evaluate the given expression using the given data Note that for the dgc-business-rules you should also provide the external values in the data field
Implementation
static dynamic evaluate(dynamic expr, dynamic data) {
if (expr is String || expr is num || expr is bool) {
return expr;
}
if (expr == null) {
throw CertLogicException('invalid CertLogic expression: $expr');
}
if (expr is Iterable) {
return expr.map<dynamic>((dynamic item) => evaluate(item, data));
}
if (expr is Map) {
final keys = expr.keys;
if (keys.length != 1) {
throw CertLogicException('unrecognised expression object encountered');
}
final operatorAsString = keys.first as String;
final dynamic values = expr[operatorAsString];
if (operatorAsString == 'var') {
return _evaluateVar(values, data);
}
if (values is! List || values.isEmpty) {
throw CertLogicException(
"operation not of the form { '<operator>': [ <values...> ] }");
}
if (operatorAsString == 'if') {
final dynamic guard = values[0];
final dynamic then = values[1];
final dynamic elseDo = values[2];
return _evaluateIf(guard, then, elseDo, data);
}
if ([
'===',
'and',
'>',
'<',
'>=',
'<=',
'in',
'+',
'after',
'before',
'not-after',
'not-before'
].contains(operatorAsString)) {
return _evaluateInfix(operatorAsString, values, data);
}
if (operatorAsString == '!') {
return _evaluateNot(values[0], data);
}
if (operatorAsString == 'plusTime') {
return _evaluatePlusTime(
values[0], values[1], values[2] as String, data);
}
if (operatorAsString == 'reduce') {
return _evaluateReduce(values[0], values[1], values[2], data);
}
if (operatorAsString == 'extractFromUVCI' ||
operatorAsString == 'extractFromUCI') {
return _evaluateExtractFromUVCI(
values.elementAt(0), values.elementAt(1), data);
}
throw CertLogicException("unrecognised operator: '$operatorAsString'");
}
throw CertLogicException('invalid CertLogic expression: $expr');
}