aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKim Alvefur <zash@zash.se>2021-03-19 01:17:59 +0100
committerKim Alvefur <zash@zash.se>2021-03-19 01:17:59 +0100
commit7f04df223a369d7d3bb92cf94d0ad64ad5fb6ac9 (patch)
treeae9544ebae148df5f9159b03df6f913ebaa4efb6
parent3c3cdcd0c7a6895b90d03480bbc9fba69b74008f (diff)
downloadprosody-7f04df223a369d7d3bb92cf94d0ad64ad5fb6ac9.tar.gz
prosody-7f04df223a369d7d3bb92cf94d0ad64ad5fb6ac9.zip
util.datamapper: Fix arrays nesting one level too deep
-rw-r--r--spec/util_datamapper_spec.lua22
-rw-r--r--teal-src/util/datamapper.tl16
-rw-r--r--util/datamapper.lua18
3 files changed, 31 insertions, 25 deletions
diff --git a/spec/util_datamapper_spec.lua b/spec/util_datamapper_spec.lua
index ee4d3c16..6d75facf 100644
--- a/spec/util_datamapper_spec.lua
+++ b/spec/util_datamapper_spec.lua
@@ -46,10 +46,13 @@ describe("util.datampper", function()
type = "string";
xml = {name = "origin-id"; namespace = "urn:xmpp:sid:0"; x_single_attribute = "id"};
};
- reactions = {
- type = "array";
- xml = {namespace = "urn:xmpp:reactions:0"; wrapped = true};
- items = {type = "string"; xml = {name = "reaction"}};
+ react = {
+ type = "object";
+ xml = {namespace = "urn:xmpp:reactions:0"; name = "reactions"};
+ properties = {
+ to = {type = "string"; xml = {attribute = true; name = "id"}};
+ reactions = {type = "array"; items = {type = "string"; xml = {name = "reaction"}}};
+ };
};
};
};
@@ -80,9 +83,12 @@ describe("util.datampper", function()
state = "active";
fallback = true;
origin_id = "qgkmMdPB";
- reactions = {
- "👋",
- "🐢",
+ react = {
+ to = "744f6e18-a57a-11e9-a656-4889e7820c76";
+ reactions = {
+ "👋",
+ "🐢",
+ };
};
};
end);
@@ -102,6 +108,8 @@ describe("util.datampper", function()
assert.equal(x:get_child_text("delay", "urn:xmpp:delay"), u:get_child_text("delay", "urn:xmpp:delay"));
assert.same(x:get_child("delay", "urn:xmpp:delay").attr, u:get_child("delay", "urn:xmpp:delay").attr);
assert.same(x:get_child("origin-id", "urn:xmpp:sid:0").attr, u:get_child("origin-id", "urn:xmpp:sid:0").attr);
+ assert.same(x:get_child("reactions", "urn:xmpp:reactions:0").attr, u:get_child("reactions", "urn:xmpp:reactions:0").attr);
+ assert.same(2, #u:get_child("reactions", "urn:xmpp:reactions:0").tags);
for _, tag in ipairs(x.tags) do
if tag.name ~= "UNRELATED" then
assert.truthy(u:get_child(tag.name, tag.attr.xmlns) or u:get_child(tag.name), tag:top_tag())
diff --git a/teal-src/util/datamapper.tl b/teal-src/util/datamapper.tl
index 28468d2d..f0e7d6bc 100644
--- a/teal-src/util/datamapper.tl
+++ b/teal-src/util/datamapper.tl
@@ -216,7 +216,7 @@ local function parse (schema : json_schema_object, s : st.stanza_t) : table
end
end
-local function unparse ( schema : json_schema_object, t : table, current_name : string, current_ns : string ) : st.stanza_t
+local function unparse ( schema : json_schema_object, t : table, current_name : string, current_ns : string, ctx : st.stanza_t ) : st.stanza_t
if schema.xml then
if schema.xml.name then
@@ -228,7 +228,7 @@ local function unparse ( schema : json_schema_object, t : table, current_name :
-- TODO prefix?
end
- local out = st.stanza(current_name, { xmlns = current_ns })
+ local out = ctx or st.stanza(current_name, { xmlns = current_ns })
if schema.type == "object" then
@@ -303,15 +303,13 @@ local function unparse ( schema : json_schema_object, t : table, current_name :
out:add_direct_child(c);
end
elseif proptype == "array" and propschema is json_schema_object and v is table then
- local c = unparse(propschema, v, name, namespace);
- if c then
- if value_where == "in_wrapper" then
- local w = st.stanza(propschema.xml.name or name, { xmlns = propschema.xml.namespace or namespace })
- w:add_direct_child(c);
- out:add_direct_child(w);
- else
+ if value_where == "in_wrapper" then
+ local c = unparse(propschema, v, name, namespace);
+ if c then
out:add_direct_child(c);
end
+ else
+ unparse(propschema, v, name, namespace, out);
end
else
error "NYI"
diff --git a/util/datamapper.lua b/util/datamapper.lua
index 65524279..a0c11166 100644
--- a/util/datamapper.lua
+++ b/util/datamapper.lua
@@ -1,5 +1,7 @@
local st = require("util.stanza");
+local schema_t = {}
+
local function toboolean(s)
if s == "true" or s == "1" then
return true
@@ -181,7 +183,7 @@ local function parse(schema, s)
end
end
-local function unparse(schema, t, current_name, current_ns)
+local function unparse(schema, t, current_name, current_ns, ctx)
if schema.xml then
if schema.xml.name then
@@ -193,7 +195,7 @@ local function unparse(schema, t, current_name, current_ns)
end
- local out = st.stanza(current_name, {xmlns = current_ns})
+ local out = ctx or st.stanza(current_name, {xmlns = current_ns})
if schema.type == "object" then
@@ -268,15 +270,13 @@ local function unparse(schema, t, current_name, current_ns)
out:add_direct_child(c);
end
elseif proptype == "array" and type(propschema) == "table" and type(v) == "table" then
- local c = unparse(propschema, v, name, namespace);
- if c then
- if value_where == "in_wrapper" then
- local w = st.stanza(propschema.xml.name or name, {xmlns = propschema.xml.namespace or namespace})
- w:add_direct_child(c);
- out:add_direct_child(w);
- else
+ if value_where == "in_wrapper" then
+ local c = unparse(propschema, v, name, namespace);
+ if c then
out:add_direct_child(c);
end
+ else
+ unparse(propschema, v, name, namespace, out);
end
else
error("NYI")