From cabb5f25bcc439d5dae04248bc1847c019cdba40 Mon Sep 17 00:00:00 2001 From: Philipp Ossler Date: Thu, 22 Aug 2024 08:47:28 +0200 Subject: [PATCH] fix: number() return null Correct the function number() to return null if the given string is not a number, instead of throwing an exception. --- .../builtin/ConversionBuiltinFunctions.scala | 26 ++++++++++++++----- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/src/main/scala/org/camunda/feel/impl/builtin/ConversionBuiltinFunctions.scala b/src/main/scala/org/camunda/feel/impl/builtin/ConversionBuiltinFunctions.scala index 2d225c55a..32f458756 100644 --- a/src/main/scala/org/camunda/feel/impl/builtin/ConversionBuiltinFunctions.scala +++ b/src/main/scala/org/camunda/feel/impl/builtin/ConversionBuiltinFunctions.scala @@ -170,16 +170,25 @@ class ConversionBuiltinFunctions(valueMapper: ValueMapper) { builtinFunction( params = List("from"), invoke = { case List(ValString(from)) => - ValNumber(from) + parseNumber(from) } ) + private def parseNumber(from: String): Val = { + Try( + ValNumber(from) + ).getOrElse( + ValError(s"Can't parse '$from' as a number") + ) + } + private def numberFunction2 = builtinFunction( params = List("from", "grouping separator"), invoke = { case List(ValString(from), ValString(grouping)) if (isValidGroupingSeparator(grouping)) => - ValNumber(from.replace(grouping, "")) - case List(ValString(from), ValString(grouping)) => + parseNumber(from.replace(grouping, "")) + + case List(ValString(_), ValString(_)) => ValError(s"illegal argument for grouping. Must be one of ' ', ',' or '.'") } ) @@ -191,13 +200,16 @@ class ConversionBuiltinFunctions(valueMapper: ValueMapper) { if (isValidGroupingSeparator(grouping) && isValidDecimalSeparator( decimal ) && grouping != decimal) => - ValNumber(from.replace(grouping, "").replace(decimal, ".")) + parseNumber(from.replace(grouping, "").replace(decimal, ".")) + case List(ValString(from), ValNull, ValString(decimal)) if isValidDecimalSeparator(decimal) => - ValNumber(from.replace(decimal, ".")) + parseNumber(from.replace(decimal, ".")) + case List(ValString(from), ValString(grouping), ValNull) if isValidGroupingSeparator(grouping) => - ValNumber(from.replace(grouping, "")) - case List(ValString(from), ValString(grouping), ValString(decimal)) => + parseNumber(from.replace(grouping, "")) + + case List(ValString(_), ValString(_), ValString(_)) => ValError( s"illegal arguments for grouping or decimal. Must be one of ' ' (grouping only), ',' or '.'" )