Blame lib/posix/_argcheck.lua

Packit 437b5e
--[[
Packit 437b5e
 POSIX library for Lua 5.1, 5.2 & 5.3.
Packit 437b5e
 (c) Gary V. Vaughan <gary@vaughan.pe>, 2014-2015
Packit 437b5e
]]
Packit 437b5e
--[[--
Packit 437b5e
 Private argument checking helpers.
Packit 437b5e
Packit 437b5e
 Undocumented internal helpers for argcheck wrapping.
Packit 437b5e
Packit 437b5e
 @module posix._checkarg
Packit 437b5e
]]
Packit 437b5e
Packit 437b5e
Packit 437b5e
local function argerror (name, i, extramsg, level)
Packit 437b5e
  level = level or 1
Packit 437b5e
  local s = string.format ("bad argument #%d to '%s'", i, name)
Packit 437b5e
  if extramsg ~= nil then
Packit 437b5e
    s = s .. " (" .. extramsg .. ")"
Packit 437b5e
  end
Packit 437b5e
  error (s, level + 1)
Packit 437b5e
end
Packit 437b5e
Packit 437b5e
local function toomanyargerror (name, expected, got, level)
Packit 437b5e
  level = level or 1
Packit 437b5e
  local fmt = "no more than %d argument%s expected, got %d"
Packit 437b5e
  argerror (name, expected + 1,
Packit 437b5e
            fmt:format (expected, expected == 1 and "" or "s", got), level + 1)
Packit 437b5e
end
Packit 437b5e
Packit 437b5e
local function argtypeerror (name, i, expect, actual, level)
Packit 437b5e
  level = level or 1
Packit 437b5e
  local fmt = "%s expected, got %s"
Packit 437b5e
  argerror (name, i,
Packit 437b5e
            fmt:format (expect, type (actual):gsub ("nil", "no value")), level + 1)
Packit 437b5e
end
Packit 437b5e
Packit 437b5e
local function badoption (name, i, what, option, level)
Packit 437b5e
  level = level or 1
Packit 437b5e
  local fmt = "invalid %s option '%s'"
Packit 437b5e
  argerror (name, i, fmt:format (what, option), level + 1)
Packit 437b5e
end
Packit 437b5e
Packit 437b5e
local function checkint (name, i, actual, level)
Packit 437b5e
  level = level or 1
Packit 437b5e
  if type (actual) ~= "number" then
Packit 437b5e
    argtypeerror (name, i, "int", actual, level + 1)
Packit 437b5e
  end
Packit 437b5e
  return actual
Packit 437b5e
end
Packit 437b5e
Packit 437b5e
local function checkstring (name, i, actual, level)
Packit 437b5e
  level = level or 1
Packit 437b5e
  if type (actual) ~= "string" then
Packit 437b5e
    argtypeerror (name, i, "string", actual, level + 1)
Packit 437b5e
  end
Packit 437b5e
  return actual
Packit 437b5e
end
Packit 437b5e
Packit 437b5e
local function checkselection (fname, argi, fields, level)
Packit 437b5e
  level = level or 1
Packit 437b5e
  local field1, type1 = fields[1], type (fields[1])
Packit 437b5e
  if type1 == "table" and #fields > 1 then
Packit 437b5e
    toomanyargerror (fname, argi, #fields + argi - 1, level + 1)
Packit 437b5e
  elseif field1 ~= nil and type1 ~= "table" and type1 ~= "string" then
Packit 437b5e
    argtypeerror (fname, argi, "table, string or nil", field1, level + 1)
Packit 437b5e
  end
Packit 437b5e
  for i = 2, #fields do
Packit 437b5e
    checkstring (fname, i + argi - 1, fields[i], level + 1)
Packit 437b5e
  end
Packit 437b5e
end
Packit 437b5e
Packit 437b5e
local function checktable (name, i, actual, level)
Packit 437b5e
  level = level or 1
Packit 437b5e
  if type (actual) ~= "table" then
Packit 437b5e
    argtypeerror (name, i, "table", actual, level + 1)
Packit 437b5e
  end
Packit 437b5e
  return actual
Packit 437b5e
end
Packit 437b5e
Packit 437b5e
local function optint (name, i, actual, def, level)
Packit 437b5e
  level = level or 1
Packit 437b5e
  if actual ~= nil and type (actual) ~= "number" then
Packit 437b5e
    argtypeerror (name, i, "int or nil", actual, level + 1)
Packit 437b5e
  end
Packit 437b5e
  return actual or def
Packit 437b5e
end
Packit 437b5e
Packit 437b5e
local function optstring (name, i, actual, def, level)
Packit 437b5e
  level = level or 1
Packit 437b5e
  if actual ~= nil and type (actual) ~= "string" then
Packit 437b5e
    argtypeerror (name, i, "string or nil", actual, level + 1)
Packit 437b5e
  end
Packit 437b5e
  return actual or def
Packit 437b5e
end
Packit 437b5e
Packit 437b5e
local function opttable (name, i, actual, def, level)
Packit 437b5e
  level = level or 1
Packit 437b5e
  if actual ~= nil and type (actual) ~= "table" then
Packit 437b5e
    argtypeerror (name, i, "table or nil", actual, level + 1)
Packit 437b5e
  end
Packit 437b5e
  return actual or def
Packit 437b5e
end
Packit 437b5e
Packit 437b5e
Packit 437b5e
return {
Packit 437b5e
  argerror        = argerror,
Packit 437b5e
  argtypeerror    = argtypeerror,
Packit 437b5e
  badoption       = badoption,
Packit 437b5e
  checkint        = checkint,
Packit 437b5e
  checkselection  = checkselection,
Packit 437b5e
  checkstring     = checkstring,
Packit 437b5e
  checktable      = checktable,
Packit 437b5e
  optint          = optint,
Packit 437b5e
  optstring       = optstring,
Packit 437b5e
  opttable        = opttable,
Packit 437b5e
  toomanyargerror = toomanyargerror,
Packit 437b5e
}