Software /
code /
prosody
File
util/serialization.lua @ 1248:9a482f76a20a
modulemanager: Made some code more concise
author | Waqas Hussain <waqas20@gmail.com> |
---|---|
date | Sun, 31 May 2009 00:54:33 +0500 |
parent | 1135:355f9487ab38 |
child | 1523:841d61be198f |
line wrap: on
line source
-- Prosody IM v0.4 -- Copyright (C) 2008-2009 Matthew Wild -- Copyright (C) 2008-2009 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 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 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, "}"); 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;