Skip to main content

use-array-flatten

Summary: Prefer using array.flatten over nested array.concat calls

Category: Idiomatic

Avoid

package policy

flat1 := array.concat(arr1, array.concat(arr2, arr3))

flat2 := array.concat(arr1, array.concat(arr2, array.concat(arr3, arr4)))

Prefer

package policy

flat1 := array.flatten([arr1, arr2, arr3])

flat2 := array.flatten([arr1, arr2, arr3, arr4])

Rationale

Since the introduction of array.flatten (OPA v1.13.0), nested array.concat calls can be replaced by a single call to array.flatten, which is both easier to read and more efficient. Double win!

(Optional) Recommend replacing array.concat calls wrapping arguments

The array.concat function is sometimes used to prepend or append a non-array value to an array, by wrapping the non-array value in an array literal. Since the array.flatten function accepts values of any type, it can be used in place of array.concat in these cases too, which arguably looks cleaner. Set the flag-wrapped-concat configuration option to true to enable this check.

Avoid

package policy

flat := array.concat([not_arr], arr) # => [not_arr, arr...]

Prefer

package policy

flat := array.flatten([not_arr, arr]) # => [not_arr, arr...]

(Optional) Always prefer array.flatten over array.concat

Since there is nothing that array.concat can do that array.flatten cannot, some users and teams may prefer the consistency of using a single function for all their concatenation needs. Set the flag-all-concat configuration option to true to always recommend replacing array.concat with array.flatten.

Exceptions

If you are targeting an OPA version prior to v1.13.0, you'll need to provide Regal with the capabilities of your OPA, so that only rules applicable to your OPA version are enforced. See the capabilities page of the documentation for more details.

Configuration Options

This linter rule provides the following configuration options:

rules:
idiomatic:
use-array-flatten:
# one of "error", "warning", "ignore"
level: error
# recommend also replacing calls to `array.concat` where at least one argument is an array literal,
# e.g. `array.concat([a], b)` -> `array.flatten([a, b])`
#
# default: false
flag-wrapped-concat: false
# recommend replacing all calls to `array.concat` with `array.flatten`
#
# default: false
flag-all-concat: false