Software /
code /
prosody
File
util/serialization.lua @ 3631:138f385e8246
MUC: Include the user's current presence contents when broadcasting an affiliation change.
author | Waqas Hussain <waqas20@gmail.com> |
---|---|
date | Fri, 19 Nov 2010 03:06:51 +0500 |
parent | 2923:b7049746bd29 |
child | 3736:73399dd525e8 |
line wrap: on
line source
-- Prosody IM -- Copyright (C) 2008-2010 Matthew Wild -- Copyright (C) 2008-2010 Waqas Hussain -- -- This project is MIT/X11 licensed. Please see the -- COPYING file in the source package for more information. -- local string_rep = string.rep; local type = type; local tostring = tostring; local t_insert = table.insert; local t_concat = table.concat; local error = error; local pairs = pairs; local next = next; local debug_traceback = debug.traceback; local log = require "util.logger".init("serialization"); module "serialization" local indent = function(i) return string_rep("\t", i); end local function basicSerialize (o) if type(o) == "number" or type(o) == "boolean" then return tostring(o); else -- assume it is a string -- FIXME make sure it's a string. throw an error otherwise. return (("%q"):format(tostring(o)):gsub("\\\n", "\\n")); end end local function _simplesave(o, ind, t, func) if type(o) == "number" then func(t, tostring(o)); elseif type(o) == "string" then func(t, (("%q"):format(o):gsub("\\\n", "\\n"))); elseif type(o) == "table" then if next(o) ~= nil then func(t, "{\n"); for k,v in pairs(o) do func(t, indent(ind)); func(t, "["); func(t, basicSerialize(k)); func(t, "] = "); if ind == 0 then _simplesave(v, 0, t, func); else _simplesave(v, ind+1, t, func); end func(t, ";\n"); end func(t, indent(ind-1)); func(t, "}"); else func(t, "{}"); end elseif type(o) == "boolean" then func(t, (o and "true" or "false")); else log("error", "cannot serialize a %s: %s", type(o), debug_traceback()) func(t, "nil"); end end function append(t, o) _simplesave(o, 1, t, t.write or t_insert); return t; end function serialize(o) return t_concat(append({}, o)); end function deserialize(str) error("Not implemented"); end return _M;