aboutsummaryrefslogtreecommitdiffstats
path: root/util
diff options
context:
space:
mode:
authorKim Alvefur <zash@zash.se>2016-11-26 21:50:06 +0100
committerKim Alvefur <zash@zash.se>2016-11-26 21:50:06 +0100
commite7a31b6e19d3aaf4e20ea62cc072195c6a0734b0 (patch)
tree4c952f7fe909ccb9d8ed3aba30ad2b9c8c154af9 /util
parent0ff95b16160d80de3a43be87353ce30e58c86ec1 (diff)
downloadprosody-e7a31b6e19d3aaf4e20ea62cc072195c6a0734b0.tar.gz
prosody-e7a31b6e19d3aaf4e20ea62cc072195c6a0734b0.zip
util.rsm: Move out from mod_mam directory
Diffstat (limited to 'util')
-rw-r--r--util/rsm.lua87
1 files changed, 87 insertions, 0 deletions
diff --git a/util/rsm.lua b/util/rsm.lua
new file mode 100644
index 00000000..7d5fbcab
--- /dev/null
+++ b/util/rsm.lua
@@ -0,0 +1,87 @@
+local stanza = require"util.stanza".stanza;
+local tostring, tonumber = tostring, tonumber;
+local type = type;
+local pairs = pairs;
+
+local xmlns_rsm = 'http://jabber.org/protocol/rsm';
+
+local element_parsers = {};
+
+do
+ local parsers = element_parsers;
+ local function xs_int(st)
+ return tonumber((st:get_text()));
+ end
+ local function xs_string(st)
+ return st:get_text();
+ end
+
+ parsers.after = xs_string;
+ parsers.before = function(st)
+ local text = st:get_text();
+ return text == "" or text;
+ end;
+ parsers.max = xs_int;
+ parsers.index = xs_int;
+
+ parsers.first = function(st)
+ return { index = tonumber(st.attr.index); st:get_text() };
+ end;
+ parsers.last = xs_string;
+ parsers.count = xs_int;
+end
+
+local element_generators = setmetatable({
+ first = function(st, data)
+ if type(data) == "table" then
+ st:tag("first", { index = data.index }):text(data[1]):up();
+ else
+ st:tag("first"):text(tostring(data)):up();
+ end
+ end;
+ before = function(st, data)
+ if data == true then
+ st:tag("before"):up();
+ else
+ st:tag("before"):text(tostring(data)):up();
+ end
+ end
+}, {
+ __index = function(_, name)
+ return function(st, data)
+ st:tag(name):text(tostring(data)):up();
+ end
+ end;
+});
+
+
+local function parse(set)
+ local rs = {};
+ for tag in set:childtags() do
+ local name = tag.name;
+ local parser = name and element_parsers[name];
+ if parser then
+ rs[name] = parser(tag);
+ end
+ end
+ return rs;
+end
+
+local function generate(t)
+ local st = stanza("set", { xmlns = xmlns_rsm });
+ for k,v in pairs(t) do
+ if element_parsers[k] then
+ element_generators[k](st, v);
+ end
+ end
+ return st;
+end
+
+local function get(st)
+ local set = st:get_child("set", xmlns_rsm);
+ if set and #set.tags > 0 then
+ return parse(set);
+ end
+end
+
+return { parse = parse, generate = generate, get = get };