evaluate static method

dynamic evaluate(
  1. dynamic expr,
  2. 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');
}