diff options
Diffstat (limited to 'lib/supple/request.lua')
-rw-r--r-- | lib/supple/request.lua | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/lib/supple/request.lua b/lib/supple/request.lua index 7f01e99..ab8388a 100644 --- a/lib/supple/request.lua +++ b/lib/supple/request.lua @@ -10,7 +10,14 @@ -- For licence terms, see COPYING -- +local capi = require 'supple.capi' +local objects = require 'supple.objects' + local tconcat = table.concat +local ipairs = ipairs +local select = select +local loadstring = loadstring +local setfenv = setfenv local function serialise_error(errstr, traceback) return tconcat { @@ -20,13 +27,88 @@ local function serialise_error(errstr, traceback) } end +local function _serialise_object(obj, ret) + ret[#ret+1] = "{" + local comma = "" + if obj.type then + ret[#ret+1] = ("type=%q"):format(obj.type) + comma = "," + end + ret[#ret+1] = ("%stag=%q"):format(comma, obj.tag) + if obj.methods then + ret[#ret+1] = ",methods={" + comma = "" + for _, meth in ipairs(obj.methods) do + ret[#ret+1] = ("%s%q"):format(comma, meth) + comma = "," + end + ret[#ret+1] = "}" + end + ret[#ret+1] = "}" +end + local function serialise_request(obj, method, ...) + assert(capi.rawtype(obj) == "string") + assert(capi.rawtype(method) == "string") + local args = { n = select("#", ...), ... } + local ret = { + ("object=%q,"):format(obj), + ("method=%q,"):format(method), + ("args={n=%d"):format(args.n) + } + + for i = 1, args.n do + local v = objects.give(args[i]) + if capi.rawtype(v) == "string" then + ret[#ret+1] = (",%q"):format(v) + elseif capi.rawtype(v) == "table" then + ret[#ret+1] = "," + _serialise_object(v, ret) + else + ret[#ret+1] = "," .. tostring(v) + end + end + + ret[#ret+1] = "}" + return tconcat(ret) end local function serialise_response(...) + local args = { n = select("#", ...), ... } + local ret = { + "error=false,", + ("results={n=%d"):format(args.n) + } + + for i = 1, args.n do + local v = objects.give(args[i]) + if capi.rawtype(v) == "string" then + ret[#ret+1] = (",%q"):format(v) + elseif capi.rawtype(v) == "table" then + ret[#ret+1] = "," + _serialise_object(v, ret) + else + ret[#ret+1] = "," .. tostring(v) + end + end + + ret[#ret+1] = "}" + return tconcat(ret) end local function deserialise_entity(entity) + local str = ("return {%s}"):format(entity) + local fn = assert(loadstring(str)) + setfenv(fn, {}) + local res = fn() + local walk = res.args or res.results + if walk then + assert(walk.n, "Elements missing 'n'") + for i = 1, walk.n do + walk[i] = objects.receive(walk[i]) + end + end + return res end return { |