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})
{
  if (expression == null) return null;

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

  try
  {
    // setup variable substitutions
    if (variables != null) {
      variables.forEach((key,value)
    {
      i++;
      var mKey = "___V$i";
      myVariables[mKey] = S.toNum(value) ?? S.toBool(value) ?? value;
      myExpression = myExpression.replaceAll(key!, mKey);
    });
    }

    // 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
    myParsed  = Expression.tryParse(myExpression);

    // failed parse?
    if (myParsed == null) throw(Exception('Failed to parse $myExpression'));

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

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