comparison mod_rest/jsonmap.lib.lua @ 3878:9a3dfe0bf9fd

mod_rest: Add JSON mapping for dataform (XEP-0004)
author Kim Alvefur <zash@zash.se>
date Tue, 04 Feb 2020 22:06:19 +0100
parents 562b34050561
children 44c2d36c40a4
comparison
equal deleted inserted replaced
3877:562b34050561 3878:9a3dfe0bf9fd
1 local array = require "util.array"; 1 local array = require "util.array";
2 local jid = require "util.jid"; 2 local jid = require "util.jid";
3 local json = require "util.json"; 3 local json = require "util.json";
4 local st = require "util.stanza"; 4 local st = require "util.stanza";
5 local xml = require "util.xml"; 5 local xml = require "util.xml";
6
7 -- Reused in many XEPs so declared up here
8 local dataform = {
9 "func", "jabber:x:data", "x",
10 function (s)
11 local fields = array();
12 local form = {
13 type = s.attr.type;
14 title = s:get_child_text("title");
15 instructions = s:get_child_text("instructions");
16 fields = fields;
17 };
18 for field in s:childtags("field") do
19 local i = {
20 var = field.attr.var;
21 type = field.attr.type;
22 label = field.attr.label;
23 desc = field:get_child_text("desc");
24 required = field:get_child("required") and true or nil;
25 value = field:get_child_text("value");
26 };
27 if field.attr.type == "jid-multi" or field.attr.type == "list-multi" or field.attr.type == "text-multi" then
28 local value = array();
29 for v in field:childtags("value") do
30 value:push(v:get_text());
31 end
32 if field.attr.type == "text-multi" then
33 i.value = value:concat("\n");
34 else
35 i.value = value;
36 end
37 end
38 if field.attr.type == "list-single" or field.attr.type == "list-multi" then
39 local options = array();
40 for o in field:childtags("option") do
41 options:push({ label = o.attr.label, value = o:get_child_text("value") });
42 end
43 i.options = options;
44 end
45 fields:push(i);
46 end
47 return form;
48 end;
49 function (x)
50 -- TODO
51 end;
52 };
6 53
7 local simple_types = { 54 local simple_types = {
8 -- basic message 55 -- basic message
9 body = "text_tag", 56 body = "text_tag",
10 subject = "text_tag", 57 subject = "text_tag",
135 sessionid = s.attr.sessionid, 182 sessionid = s.attr.sessionid,
136 status = s.attr.status, 183 status = s.attr.status,
137 }; 184 };
138 local actions = s:get_child("actions"); 185 local actions = s:get_child("actions");
139 local note = s:get_child("note"); 186 local note = s:get_child("note");
140 -- TODO -- local form = s:get_child("x", "jabber:x:data"); 187 local form = s:get_child("x", "jabber:x:data");
141 if actions then 188 if actions then
142 cmd.actions = { 189 cmd.actions = {
143 execute = actions.attr.execute, 190 execute = actions.attr.execute,
144 }; 191 };
145 for action in actions:childtags() do 192 for action in actions:childtags() do
148 elseif note then 195 elseif note then
149 cmd.note = { 196 cmd.note = {
150 type = note.attr.type; 197 type = note.attr.type;
151 text = note:get_text(); 198 text = note:get_text();
152 }; 199 };
200 end
201 if form then
202 cmd.form = dataform[4](form);
153 end 203 end
154 return cmd; 204 return cmd;
155 end; 205 end;
156 function (s) 206 function (s)
157 if type(s) == "table" and s ~= json.null then 207 if type(s) == "table" and s ~= json.null then