Skip to content

Commit 6bf385f

Browse files
committed
fix: List functions handle invalid position
List functions should return null if the position is zero. A position must be positive or negative but not zero.
1 parent 237431e commit 6bf385f

File tree

1 file changed

+31
-19
lines changed

1 file changed

+31
-19
lines changed

src/main/scala/org/camunda/feel/impl/builtin/ListBuiltinFunctions.scala

Lines changed: 31 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -275,20 +275,26 @@ class ListBuiltinFunctions(private val valueMapper: ValueMapper) {
275275
private def sublistFunction =
276276
builtinFunction(
277277
params = List("list", "start"),
278-
invoke = { case List(ValList(list), ValNumber(start)) =>
279-
ValList(list.slice(listIndex(list, start.intValue), list.length))
278+
invoke = {
279+
case List(ValList(_), ValNumber(start)) if start == 0 =>
280+
ValError("start position must be a non-zero number")
281+
case List(ValList(list), ValNumber(start)) =>
282+
ValList(list.slice(listIndex(list, start.intValue), list.length))
280283
}
281284
)
282285

283286
private def sublistFunction3 = builtinFunction(
284287
params = List("list", "start", "length"),
285-
invoke = { case List(ValList(list), ValNumber(start), ValNumber(length)) =>
286-
ValList(
287-
list.slice(
288-
listIndex(list, start.intValue),
289-
listIndex(list, start.intValue) + length.intValue
288+
invoke = {
289+
case List(ValList(_), ValNumber(start), ValNumber(_)) if start == 0 =>
290+
ValError("start position must be a non-zero number")
291+
case List(ValList(list), ValNumber(start), ValNumber(length)) =>
292+
ValList(
293+
list.slice(
294+
listIndex(list, start.intValue),
295+
listIndex(list, start.intValue) + length.intValue
296+
)
290297
)
291-
)
292298
}
293299
)
294300

@@ -325,23 +331,29 @@ class ListBuiltinFunctions(private val valueMapper: ValueMapper) {
325331

326332
private def insertBeforeFunction = builtinFunction(
327333
params = List("list", "position", "newItem"),
328-
invoke = { case List(ValList(list), ValNumber(position), newItem: Val) =>
329-
ValList(
330-
list
331-
.take(listIndex(list, position.intValue)) ++ (newItem :: Nil) ++ list
332-
.drop(listIndex(list, position.intValue))
333-
)
334+
invoke = {
335+
case List(ValList(_), ValNumber(position), _) if position == 0 =>
336+
ValError("position must be a non-zero number")
337+
case List(ValList(list), ValNumber(position), newItem: Val) =>
338+
ValList(
339+
list
340+
.take(listIndex(list, position.intValue)) ++ (newItem :: Nil) ++ list
341+
.drop(listIndex(list, position.intValue))
342+
)
334343
}
335344
)
336345

337346
private def removeFunction = builtinFunction(
338347
params = List("list", "position"),
339-
invoke = { case List(ValList(list), ValNumber(position)) =>
340-
ValList(
341-
list.take(listIndex(list, position.intValue)) ++ list.drop(
342-
listIndex(list, position.intValue + 1)
348+
invoke = {
349+
case List(ValList(_), ValNumber(position)) if position == 0 =>
350+
ValError("position must be a non-zero number")
351+
case List(ValList(list), ValNumber(position)) =>
352+
ValList(
353+
list.take(listIndex(list, position.intValue)) ++ list.drop(
354+
listIndex(list, position.intValue + 1)
355+
)
343356
)
344-
)
345357
}
346358
)
347359

0 commit comments

Comments
 (0)