Add a type system
Add a check_types method that can check lua types for correctness.
This commit is contained in:
parent
87556f77cc
commit
138cf12028
|
@ -0,0 +1,21 @@
|
||||||
|
--Make sure the type checking works
|
||||||
|
|
||||||
|
describe("smr type checking",function()
|
||||||
|
it("should load without errors",function()
|
||||||
|
local types = require("types")
|
||||||
|
end)
|
||||||
|
it("should not error when an argument is a number",function()
|
||||||
|
local types = require("types")
|
||||||
|
local n = 5
|
||||||
|
assert(types.number(n))
|
||||||
|
end)
|
||||||
|
it("should error when an argument is a table",function()
|
||||||
|
local types = require("types")
|
||||||
|
local t = {}
|
||||||
|
assert.has.errors(function()
|
||||||
|
types.number(t)
|
||||||
|
end)
|
||||||
|
end)
|
||||||
|
end)
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,47 @@
|
||||||
|
--[[
|
||||||
|
Type checking, vaguely inspired by Python3's typing module.
|
||||||
|
]]
|
||||||
|
|
||||||
|
local types = {}
|
||||||
|
|
||||||
|
function types.positive(arg)
|
||||||
|
local is_number, err = types.number(arg)
|
||||||
|
if not is_number then
|
||||||
|
return false, err
|
||||||
|
end
|
||||||
|
if arg < 0 then
|
||||||
|
return false, string.format("was not positive")
|
||||||
|
end
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
|
||||||
|
--Basic lua types
|
||||||
|
local builtin_types = {
|
||||||
|
"nil","boolean","number","string","table","function","coroutine","userdata"
|
||||||
|
}
|
||||||
|
for _,type_ in pairs(builtin_types) do
|
||||||
|
types[type_] = function(arg)
|
||||||
|
local argtype = type(arg)
|
||||||
|
if not argtype == type_ then
|
||||||
|
return false, string.format("was not a %s, was a %s",type_,argtype)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function types.matches_pattern(pattern)
|
||||||
|
return function(arg)
|
||||||
|
local is_string, err = types.string(arg)
|
||||||
|
if not is_string then
|
||||||
|
return false, err
|
||||||
|
end
|
||||||
|
if not string.match(arg, pattern) then
|
||||||
|
return false, string.format(
|
||||||
|
"Expected %q to match pattern %q, but it did not.",
|
||||||
|
arg,
|
||||||
|
pattern
|
||||||
|
)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
return types
|
|
@ -222,6 +222,36 @@ function util.parse_tags(str)
|
||||||
return tags
|
return tags
|
||||||
end
|
end
|
||||||
|
|
||||||
|
if config.debugging then
|
||||||
|
function util.checktypes(...)
|
||||||
|
local args = {...}
|
||||||
|
if #args == 1 then
|
||||||
|
args = table.unpack(args)
|
||||||
|
end
|
||||||
|
assert(
|
||||||
|
#args % 3 == 0,
|
||||||
|
"Arguments to checktypes() must be triplets of " ..
|
||||||
|
"<variable>, <lua type>, <type check function> "
|
||||||
|
)
|
||||||
|
for i = 1,#args,3 do
|
||||||
|
local var, ltype, veri_f = args[i+0], args[i+1], args[i+2]
|
||||||
|
assert(
|
||||||
|
type(var) == ltype,
|
||||||
|
string.format(
|
||||||
|
"Expected argument %d (%q) to be type %s, but was %s",
|
||||||
|
i/3
|
||||||
|
)
|
||||||
|
)
|
||||||
|
if veri_f then
|
||||||
|
assert(veri_f(var))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
else
|
||||||
|
function util.checktypes(...)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
local function decodeentity(capture)
|
local function decodeentity(capture)
|
||||||
return string.char(tonumber(capture,16)) --Decode base 16 and conver to character
|
return string.char(tonumber(capture,16)) --Decode base 16 and conver to character
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in New Issue