Lua env config loader with typed defaults

Lua
local function load_env(spec, getenv)
  getenv = getenv or os.getenv
  local cfg = {}
  for key, rule in pairs(spec) do
    local raw = getenv(key)
    if raw == nil or raw == '' then
      if rule.default == nil then error('missing required env: ' .. key, 0) end
      raw = rule.default
    end
    if rule.number then
      local n = tonumber(raw)
      if not n then error(('%s is not a number: %q'):format(key, raw), 0) end
      raw = n
    end
    cfg[rule.as or key] = raw
  end
  return cfg
end

return load_env