From 7f04df223a369d7d3bb92cf94d0ad64ad5fb6ac9 Mon Sep 17 00:00:00 2001 From: Kim Alvefur Date: Fri, 19 Mar 2021 01:17:59 +0100 Subject: util.datamapper: Fix arrays nesting one level too deep --- spec/util_datamapper_spec.lua | 22 +++++++++++++++------- teal-src/util/datamapper.tl | 16 +++++++--------- util/datamapper.lua | 18 +++++++++--------- 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") -- cgit v1.2.3