| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105 |
- -- Copyright 2019 云风 https://github.com/cloudwu . All rights reserved.
- -- License (the same with bgfx) : https://github.com/bkaradzic/bgfx/blob/master/LICENSE
- local idl = {}
- local all_types = {}
- local function typedef(_, typename)
- assert(all_types[typename] == nil, "Duplicate type")
- local t = {}
- all_types[typename] = t
- local function type_attrib(attrib)
- assert(type(attrib) == "table", "type attrib should be a table")
- for _, a in ipairs(attrib) do
- t[a] = true
- end
- end
- return function(cname)
- local typ = type(cname)
- if typ == "table" then
- type_attrib(cname)
- return
- end
- assert(typ == "string" , "type should be a string")
- t.cname = cname
- return type_attrib
- end
- end
- idl.typedef = setmetatable({} , { __index = typedef, __call = typedef })
- idl.types = all_types
- local all_funcs = {}
- local function duplicate_arg_name(name)
- error ("Duplicate arg name " .. name)
- end
- local function funcdef(_, funcname)
- local f = { name = funcname , args = {} }
- all_funcs[#all_funcs+1] = f
- local args
- local function args_desc(obj, args_name)
- obj[args_name] = duplicate_arg_name
- return function (fulltype)
- local arg = {
- name = "_" .. args_name,
- fulltype = fulltype,
- }
- f.args[#f.args+1] = arg
- local function arg_attrib(_, attrib )
- assert(type(attrib) == "table", "Arg attributes should be a table")
- for _, a in ipairs(attrib) do
- arg[a] = true
- end
- return args
- end
- return setmetatable( {} , {
- __index = function(_, name)
- return args_desc(obj, name)
- end
- , __call = arg_attrib } )
- end
- end
- args = setmetatable({}, { __index = args_desc })
- local function rettype(value)
- assert(type(value) == "string", "Need return type")
- f.ret = { fulltype = value }
- return args
- end
- local function funcdef(value)
- if type(value) == "table" then
- for k,v in pairs(value) do
- if type(k) == "number" then
- f[v] = true
- else
- f[k] = v
- end
- end
- return rettype
- end
- return rettype(value)
- end
- local function classfunc(_, methodname)
- f.class = f.name
- f.name = methodname
- return funcdef
- end
- return setmetatable({} , { __index = classfunc, __call = function(_, value) return funcdef(value) end })
- end
- idl.func = setmetatable({}, { __index = funcdef })
- idl.funcs = all_funcs
- idl.handle = "handle"
- idl.enum = "enum"
- idl.out = "out"
- idl.const = "const"
- return setmetatable(idl , { __index = function (_, keyword)
- error (tostring(keyword) .. " is invalid")
- end})
|