Seven operators hand-wrote the same count check and the same message.
Move it to Operators, next to evalArgs, whose result it always checks.
Messages are unchanged, so no fixture moves.
Co-authored-by: Cursor <cursoragent@cursor.com>
Splits a string into an array of fields, keeping empty ones, so rules can
target locale subtags, product-id namespaces and similar composite values.
A var path cannot index the result of an expression, so a positional field
is read by wrapping the array in a one-element list and letting an
iteration operator rebind scope to it. The array is also usable directly
by in and by the iteration operators.
Fields are never coerced to numbers, and a non-string operand or empty
separator throws typeMismatch rather than splitting into characters.
Co-authored-by: Cursor <cursoragent@cursor.com>