evaluate static method
dynamic
evaluate(})
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;
}