fix: vim.validate() order is not deterministic #28377

Problem:
The order of the validation performed by vim.validate() is
unpredictable.
- harder to write reliable tests.
- confusing UX because validation result might return different errors randomly.

Solution:
Iterate the input using `vim.spairs()`.

Future:
Ideally, the caller could provide an "ordered dict".
This commit is contained in:
Justin M. Keyes
2024-04-16 07:31:43 -07:00
committed by GitHub
parent 5cfdaaaeac
commit fe4583127f
2 changed files with 6 additions and 4 deletions

View File

@ -578,7 +578,7 @@ end
---@return fun(table: table<K, V>, index?: K):K, V # |for-in| iterator over sorted keys and their values
---@return T
function vim.spairs(t)
vim.validate({ t = { t, 't' } })
assert(type(t) == 'table', ('expected table, got %s'):format(type(t)))
--- @cast t table<any,any>
-- collect the keys
@ -795,7 +795,7 @@ do
return false, string.format('opt: expected table, got %s', type(opt))
end
for param_name, spec in pairs(opt) do
for param_name, spec in vim.spairs(opt) do
if type(spec) ~= 'table' then
return false, string.format('opt[%s]: expected table, got %s', param_name, type(spec))
end
@ -851,7 +851,8 @@ do
return true
end
--- Validates a parameter specification (types and values).
--- Validates a parameter specification (types and values). Specs are evaluated in alphanumeric
--- order, until the first failure.
---
--- Usage example:
---