diff --git a/src/main/scala/org/camunda/feel/impl/builtin/BuiltinFunction.scala b/src/main/scala/org/camunda/feel/impl/builtin/BuiltinFunction.scala index 007fd632b..8d9368029 100644 --- a/src/main/scala/org/camunda/feel/impl/builtin/BuiltinFunction.scala +++ b/src/main/scala/org/camunda/feel/impl/builtin/BuiltinFunction.scala @@ -16,8 +16,7 @@ */ package org.camunda.feel.impl.builtin -import org.camunda.feel.logger -import org.camunda.feel.syntaxtree.{Val, ValError, ValFatalError, ValFunction, ValNull} +import org.camunda.feel.syntaxtree.{Val, ValError, ValFunction} object BuiltinFunction { @@ -33,13 +32,9 @@ object BuiltinFunction { ) } - private def error: PartialFunction[List[Val], Any] = { - case args if args.exists(_.isInstanceOf[ValFatalError]) => - args.find(_.isInstanceOf[ValFatalError]) - case args if args.exists(_.isInstanceOf[ValError]) => args.find(_.isInstanceOf[ValError]) - case args => - val argumentList = args.map("'" + _ + "'").mkString(", ") - ValError(s"Illegal arguments: $argumentList") + private def error: PartialFunction[List[Val], Any] = { case args => + val argumentList = args.map("'" + _ + "'").mkString(", ") + ValError(s"Illegal arguments: $argumentList") } } diff --git a/src/main/scala/org/camunda/feel/impl/interpreter/FeelInterpreter.scala b/src/main/scala/org/camunda/feel/impl/interpreter/FeelInterpreter.scala index 60072b841..f721a22fc 100644 --- a/src/main/scala/org/camunda/feel/impl/interpreter/FeelInterpreter.scala +++ b/src/main/scala/org/camunda/feel/impl/interpreter/FeelInterpreter.scala @@ -249,6 +249,7 @@ class FeelInterpreter(private val valueMapper: ValueMapper) { findFunction(context, name, params), f => invokeFunction(f, params) match { + case fatalError: ValFatalError => fatalError case ValError(failure) if name == "assert" => error(EvaluationFailureType.ASSERT_FAILURE, failure) ValError(failure) @@ -727,10 +728,19 @@ class FeelInterpreter(private val valueMapper: ValueMapper) { } } - function.invoke(paramList) match { - case fatalError: ValFatalError => fatalError - case e: ValError => e - case result => context.valueMapper.toVal(result) + // validate parameters + if (paramList.exists(_.isInstanceOf[ValFatalError])) { + paramList.find(_.isInstanceOf[ValFatalError]).get + + } else if (paramList.exists(_.isInstanceOf[ValError])) { + paramList.find(_.isInstanceOf[ValError]).get + + } else { + function.invoke(paramList) match { + case fatalError: ValFatalError => fatalError + case e: ValError => e + case result => context.valueMapper.toVal(result) + } } } diff --git a/src/test/scala/org/camunda/feel/impl/interpreter/InterpreterUnaryTest.scala b/src/test/scala/org/camunda/feel/impl/interpreter/InterpreterUnaryTest.scala index c5db4f30e..fbdb8fa3d 100644 --- a/src/test/scala/org/camunda/feel/impl/interpreter/InterpreterUnaryTest.scala +++ b/src/test/scala/org/camunda/feel/impl/interpreter/InterpreterUnaryTest.scala @@ -529,7 +529,7 @@ class InterpreterUnaryTest evaluateUnaryTests("null", inputValue = null) should returnResult(true) } - "A function" should "be invoked with ? (input value)" in { + "A function" should "be invoked with the special variable '?'" in { evaluateUnaryTests(""" starts with(?, "f") """, "foo") should returnResult(true) evaluateUnaryTests(""" starts with(?, "b") """, "foo") should returnResult(false) @@ -541,6 +541,12 @@ class InterpreterUnaryTest evaluateUnaryTests("< min(1,2,3)", 2) should returnResult(false) } + it should "be invoked with the special variable '?' for a parameter with ANY type" in { + + evaluateUnaryTests("list contains([481, 485, 551, 483], ?)", 481) should returnResult(true) + evaluateUnaryTests("list contains([481, 485, 551, 483], ?)", 999) should returnResult(false) + } + "A unary-tests expression" should "return true if it evaluates to a value that is equal to the implicit value" in { evaluateUnaryTests("5", 5) should returnResult(true)