comparison mod_rest/jsonmap.lib.lua @ 4473:3b50a9a75fb6

mod_rest: Roundtrip disco and items when string or boolean is used E.g. {disco:true} turns to <query/> and back to {disco:true}, same with {items:true}. Similarily, {disco:"node"}, {items:"node"} turn into <query node="node"/> and back.
author Kim Alvefur <zash@zash.se>
date Fri, 26 Feb 2021 22:05:25 +0100
parents 78de3c7acf58
children 8e644bf36627
comparison
equal deleted inserted replaced
4472:f210f242cf17 4473:3b50a9a75fb6
74 74
75 -- XEP-0030 75 -- XEP-0030
76 disco = { 76 disco = {
77 type = "func", xmlns = "http://jabber.org/protocol/disco#info", tagname = "query", 77 type = "func", xmlns = "http://jabber.org/protocol/disco#info", tagname = "query",
78 st2json = function (s) --> array of features 78 st2json = function (s) --> array of features
79 if s.tags[1] == nil then
80 return s.attr.node or true;
81 end
79 local identities, features, extensions = array(), array(), {}; 82 local identities, features, extensions = array(), array(), {};
80 for tag in s:childtags() do 83 for tag in s:childtags() do
81 if tag.name == "identity" and tag.attr.category and tag.attr.type then 84 if tag.name == "identity" and tag.attr.category and tag.attr.type then
82 identities:push({ category = tag.attr.category, type = tag.attr.type, name = tag.attr.name }); 85 identities:push({ category = tag.attr.category, type = tag.attr.type, name = tag.attr.name });
83 elseif tag.name == "feature" and tag.attr.var then 86 elseif tag.name == "feature" and tag.attr.var then
113 extension["FORM_TYPE"] = form_type; 116 extension["FORM_TYPE"] = form_type;
114 disco:add_child(field_mappings.formdata.json2st(extension)); 117 disco:add_child(field_mappings.formdata.json2st(extension));
115 end 118 end
116 end 119 end
117 return disco; 120 return disco;
121 elseif type(s) == "string" then
122 return st.stanza("query", { xmlns = "http://jabber.org/protocol/disco#info", node = s });
118 else 123 else
119 return st.stanza("query", { xmlns = "http://jabber.org/protocol/disco#info", }); 124 return st.stanza("query", { xmlns = "http://jabber.org/protocol/disco#info", });
120 end 125 end
121 end; 126 end;
122 }; 127 };
123 128
124 items = { 129 items = {
125 type = "func", xmlns = "http://jabber.org/protocol/disco#items", tagname = "query", 130 type = "func", xmlns = "http://jabber.org/protocol/disco#items", tagname = "query",
126 st2json = function (s) --> array of features | map with node 131 st2json = function (s) --> array of features | map with node
127 if s.attr.node and s.tags[1] == nil then 132 if s.tags[1] == nil then
128 return { node = s.attr.node }; 133 return s.attr.node or true;
129 end 134 end
130 135
131 local items = array(); 136 local items = array();
132 for item in s:childtags("item") do 137 for item in s:childtags("item") do
133 items:push({ jid = item.attr.jid, node = item.attr.node, name = item.attr.name }); 138 items:push({ jid = item.attr.jid, node = item.attr.node, name = item.attr.name });
143 elseif type(item) == "table" then 148 elseif type(item) == "table" then
144 disco:tag("item", { jid = item.jid, node = item.node, name = item.name }); 149 disco:tag("item", { jid = item.jid, node = item.node, name = item.name });
145 end 150 end
146 end 151 end
147 return disco; 152 return disco;
153 elseif type(s) == "string" then
154 return st.stanza("query", { xmlns = "http://jabber.org/protocol/disco#items", node = s });
148 else 155 else
149 return st.stanza("query", { xmlns = "http://jabber.org/protocol/disco#items", }); 156 return st.stanza("query", { xmlns = "http://jabber.org/protocol/disco#items", });
150 end 157 end
151 end; 158 end;
152 }; 159 };