Mercurial > prosody-modules
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 |
