redundant-loop-count
Summary: Redundant count before loop
Category: Bugs
Avoid
package policy
allow if {
# redundant count and > comparison
count(input.user.roles) > 0
some role in input.user.roles
# .. do more with role ..
}
Prefer
package policy
allow if {
some role in input.user.roles
# .. do more with role ..
}
Rationale
A loop that iterates over an empty collection evaluates to nothing, and counting the collection before the loop to ensure it's not empty is therefore redundant.
Exceptions
Note that this check is currently only performed on some
loops, and not "ref-style" loops:
package policy
allow if {
# this won't be flagged
count(input.user.roles) > 0
role := input.user.roles[_]
# .. do more with role ..
}
Another good reason to prefer some .. in for iteration!
every
iteration
Counting to ensure a non-empty collection is used before every
loops may not be redundant, as every
evaluates
to true
when an empty collection is passed.
package policy
allow if {
# every would otherwise be `true` on empty input.user.roles
# so this may be valid, depending on the outcome you expect
count(input.user.roles) > 0
every role in input.user.roles {
# .. do more with each role ..
}
}
If you want to have empty collections fail on every
conditions, do make sure to use count
!
Configuration Options
This linter rule provides the following configuration options:
rules:
bugs:
redundant-loop-count:
# one of "error", "warning", "ignore"
level: error
Community
If you think you've found a problem with this rule or its documentation, would like to suggest improvements, new rules,
or just talk about Regal in general, please join us in the #regal
channel in the Styra Community
Slack!