evaluate static method

dynamic evaluate(
  1. String? expression, {
  2. Map<String?, dynamic>? variables,
  3. Map<String?, dynamic>? altFunctions,
})

Implementation

static dynamic evaluate(String? expression,
    {Map<String?, dynamic>? variables, Map<String?, dynamic>? altFunctions}) {
  // expressions with leading or trailing spaces fail parse
  expression = expression?.trim();

  // no expression specified?
  if (expression == null || expression.isEmpty) return null;

  var i = 0;
  var myExpression = expression;
  var myVariables = <String, dynamic>{};
  var myFunctions = <String?, dynamic>{};

  try {
    // setup variable substitutions
    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);
    });

    // add variables
    myFunctions.addAll(myVariables);

    // add functions
    myFunctions.addAll(functions);

    // add alternate functions that dont clash
    altFunctions?.forEach((key, value) =>
        myFunctions.containsKey(key) ? null : myFunctions[key] = value);

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

    // failed parse?
    if (myParsedExpression == null) {
      throw (Exception(
          'Failed to parse $myExpression. Error is ${myParsedResult.message}'));
    }

    // required to replace quoted string observables
    myParsedExpression = replaceInLiterals(myParsedExpression, myVariables);

    // evaluate the expression
    return evaluator.eval(myParsedExpression, myFunctions);
  } catch (e) {
    String? msg;
    variables?.forEach((key, value) => msg =
        "${msg ?? ""}${msg == null ? "" : ",  "}$key=${value.toString()}");
    Log().debug("eval($expression) [$msg] failed. Error is $e");
    return null;
  }
}