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