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 {
  var i = 0;
  var myExpression = expression;
  var myVariables = <String, dynamic>{};

  try {
    // format the expression
    if (myExpression.contains(nonQuotedSemiColons)) {
      myExpression = formatExpression(myExpression);
    }

    // build variable map and modify expression
    variables.forEach((key, value) {
      i++;
      var myKey = "___V$i";
      myVariables[myKey] = toNum(value, allowMalformed: false) ??
          toBool(value, allowFalse: ['false'], allowTrue: ['true']) ??
          value;
      myExpression = myExpression.replaceAll("$key", myKey);
    });
    variables.clear();
    variables.addAll(myVariables);

    // parse the expression
    var myParsedResult = Expression.tryParse(myExpression);
    var myParsedExpression =
        (myParsedResult is Success) ? myParsedResult.value : null;

    // Unable to preparse
    if (myParsedExpression == null) {
      Log().debug(
          'Failed to parse $myParsedExpression. Error is ${myParsedResult.message}');
      return null;
    }

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

      // execute the expression and return the result
      myExpression =
          (await Eval.evaluate(myExpression, variables: myVariables))
              .toString();
    }
  } catch (e) {
    Log().exception(e);
    return '';
  }

  return myExpression;
}