evaluate method

Future<String?> evaluate(
  1. String expression,
  2. Map<String?, dynamic> variables
)
override

Implementation

Future<String?> evaluate(String expression, Map<String?, dynamic> variables) async
{
  try
  {
    // replace non-quoted ');' with ')+' to trick parser into thinking its a binary expression
    expression = expression.replaceAll(nonQuotedSemiColons, ")+");
    while (expression.contains(")+ ")) expression = expression.replaceAll(")+ ",")+");
    expression = expression.replaceAll("+?", "?");
    expression = expression.replaceAll("+:", ":");
    if (expression.endsWith("+")) expression = expression.substring(0,expression.length - 1);

    // build variable map and modify expression
    Map<String, dynamic> _variables = Map<String, dynamic>();
    int i = 0;
    variables.forEach((key,value)
    {
      i++;
      var _key = "___V$i";
      _variables[_key] = _isNumeric(value) ? _toNum(value) : _isBool(value) ? _toBool(value) : value;
      expression = expression.replaceAll("$key", _key);
    });
    variables.clear();
    variables.addAll(_variables);

    // pre-parse the expression
    var parsed = Expression.tryParse(expression);

    // Unable to preparse
    if (parsed == null) {
      Log().debug('Unable to pre-parse conditionals $expression');
      return null;
    }

    // format call and conditional expressions as string variables
    if (parsed is ConditionalExpression)
    {
      // build event expressions as variables
      var events = getConditionals(parsed);
      events.sort((a, b) => Comparable.compare(b.length, a.length));
      expression = parsed.toString();
      events.forEach((e)
      {
        i++;
        var key = "___V$i";
        _variables[key] = e;
        expression = expression.replaceAll(e, key);
      });

      // execute the expression and get events string
      expression = await Eval.evaluate(expression, variables: _variables);
    }

    // replace non-quoted + with ;. This might be problematic. Needs testing
    expression = expression.replaceAll(nonQuotedPlusSigns, ");");
  }
  catch(e)
  {
    Log().exception(e);
    return '';
  }

  return expression;
}