From 0c1ac77390a812612745efe4d5291c41555104f5 Mon Sep 17 00:00:00 2001 From: egorkrivochko Date: Fri, 29 Dec 2023 13:30:04 +0300 Subject: [PATCH] Added supporting len(array) function. --- .../div/evaluable/function/ArrayFunctions.kt | 22 +++++++++++++++++++ .../function/BuiltinFunctionProvider.kt | 1 + .../function_signatures_array.json | 3 ++- .../expression_test_data/functions_array.json | 9 +++++--- 4 files changed, 31 insertions(+), 4 deletions(-) diff --git a/client/android/div-evaluable/src/main/java/com/yandex/div/evaluable/function/ArrayFunctions.kt b/client/android/div-evaluable/src/main/java/com/yandex/div/evaluable/function/ArrayFunctions.kt index 565429123..55c9e30e3 100644 --- a/client/android/div-evaluable/src/main/java/com/yandex/div/evaluable/function/ArrayFunctions.kt +++ b/client/android/div-evaluable/src/main/java/com/yandex/div/evaluable/function/ArrayFunctions.kt @@ -581,6 +581,28 @@ internal object GetOptDictFromArray : ArrayFunction(EvaluableType.DICT) { } } +internal object GetArrayLength : Function() { + + override val name: String = "len" + + override val declaredArgs: List = listOf( + FunctionArgument(type = EvaluableType.ARRAY) + ) + + override val resultType: EvaluableType = EvaluableType.INTEGER + + override val isPure: Boolean = false + + override fun evaluate( + evaluationContext: EvaluationContext, + expressionContext: ExpressionContext, + args: List + ): Any { + val array = args[0] as JSONArray + return array.length().toLong() + } +} + private fun evaluate(functionName: String, args: List): Any { checkIndexOfBoundException(functionName, args) val array = args[0] as JSONArray diff --git a/client/android/div-evaluable/src/main/java/com/yandex/div/evaluable/function/BuiltinFunctionProvider.kt b/client/android/div-evaluable/src/main/java/com/yandex/div/evaluable/function/BuiltinFunctionProvider.kt index 6a8e064c7..a1af989a6 100644 --- a/client/android/div-evaluable/src/main/java/com/yandex/div/evaluable/function/BuiltinFunctionProvider.kt +++ b/client/android/div-evaluable/src/main/java/com/yandex/div/evaluable/function/BuiltinFunctionProvider.kt @@ -238,6 +238,7 @@ object BuiltinFunctionProvider : FunctionProvider { registry.register(GetOptBooleanFromArray) registry.register(GetOptArrayFromArray) registry.register(GetOptDictFromArray) + registry.register(GetArrayLength) } override fun get(name: String, args: List): Function { diff --git a/test_data/expression_test_data/function_signatures_array.json b/test_data/expression_test_data/function_signatures_array.json index 382afb53c..867b5fcf5 100644 --- a/test_data/expression_test_data/function_signatures_array.json +++ b/test_data/expression_test_data/function_signatures_array.json @@ -729,7 +729,8 @@ ], "result_type": "integer", "platforms": [ - "web" + "web", + "android" ] } ] diff --git a/test_data/expression_test_data/functions_array.json b/test_data/expression_test_data/functions_array.json index c2fa10c2f..88c037316 100644 --- a/test_data/expression_test_data/functions_array.json +++ b/test_data/expression_test_data/functions_array.json @@ -847,7 +847,8 @@ } ], "platforms": [ - "web" + "web", + "android" ] }, { @@ -867,7 +868,8 @@ } ], "platforms": [ - "web" + "web", + "android" ] }, { @@ -889,7 +891,8 @@ } ], "platforms": [ - "web" + "web", + "android" ] } ]