aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKim Alvefur <zash@zash.se>2021-03-18 13:07:10 +0100
committerKim Alvefur <zash@zash.se>2021-03-18 13:07:10 +0100
commit576b43151c407e03525623a143024bda8926e640 (patch)
tree6d57a0846b3fd0a04b7d3761c551c1b7aa4d3f69
parentc62c5b307ec907b78f309dbbe90b6569fe91a3f8 (diff)
downloadprosody-576b43151c407e03525623a143024bda8926e640.tar.gz
prosody-576b43151c407e03525623a143024bda8926e640.zip
util.datamapper: Limited support for unparsing simple arrays of strings
-rw-r--r--spec/util_datamapper_spec.lua8
-rw-r--r--teal-src/util/datamapper.tl34
-rw-r--r--util/datamapper.lua52
3 files changed, 75 insertions, 19 deletions
diff --git a/spec/util_datamapper_spec.lua b/spec/util_datamapper_spec.lua
index aacaf995..ee4d3c16 100644
--- a/spec/util_datamapper_spec.lua
+++ b/spec/util_datamapper_spec.lua
@@ -103,15 +103,11 @@ describe("util.datampper", function()
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);
for _, tag in ipairs(x.tags) do
- if tag.name ~= "UNRELATED" and tag.name ~= "reactions" then
+ if tag.name ~= "UNRELATED" then
assert.truthy(u:get_child(tag.name, tag.attr.xmlns) or u:get_child(tag.name), tag:top_tag())
end
end
- assert.equal(#x.tags-2, #u.tags)
-
- pending("arrays", function ()
- assert.truthy(u:get_child("reactions", "urn:xmpp:reactions:0"))
- end);
+ assert.equal(#x.tags-1, #u.tags)
end);
end);
diff --git a/teal-src/util/datamapper.tl b/teal-src/util/datamapper.tl
index 76370ed9..86b54fc2 100644
--- a/teal-src/util/datamapper.tl
+++ b/teal-src/util/datamapper.tl
@@ -192,6 +192,8 @@ function parse_array (schema : js.schema_t, s : st.stanza_t) : { any }
error "NYI"
end
+ value = totype(proptype, value)
+
if value ~= nil then
table.insert(out, value);
end
@@ -210,7 +212,6 @@ local function parse (schema : js.schema_t, s : st.stanza_t) : table
end
local function unparse ( schema : js.schema_t, t : table, current_name : string, current_ns : string ) : st.stanza_t
- if schema.type == "object" then
if schema.xml then
if schema.xml.name then
@@ -224,6 +225,8 @@ local function unparse ( schema : js.schema_t, t : table, current_name : string,
local out = st.stanza(current_name, { xmlns = current_ns })
+ if schema.type == "object" then
+
for prop, propschema in pairs(schema.properties) do
local v = t[prop]
@@ -294,13 +297,40 @@ local function unparse ( schema : js.schema_t, t : table, current_name : string,
if c then
out:add_direct_child(c);
end
- -- else TODO
+ elseif proptype == "array" and propschema is js.schema_t 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
+ out:add_direct_child(c);
+ end
+ end
+ else
+ error "NYI"
end
end
end
end
return out;
+ elseif schema.type == "array" then
+ local proptype, value_where, name, namespace = unpack_propschema(schema.items, current_name, current_ns)
+ -- TODO , prefix, single_attribute
+ if proptype == "string" then
+ for _, item in ipairs(t as { string }) do
+ if value_where == "in_text_tag" then
+ out:text_tag(name, item, { xmlns = namespace });
+ else
+ error "NYI"
+ end
+ end
+ else
+ error "NYI"
+ end
+ return out;
end
end
diff --git a/util/datamapper.lua b/util/datamapper.lua
index a208dd7e..d2a6a963 100644
--- a/util/datamapper.lua
+++ b/util/datamapper.lua
@@ -162,6 +162,8 @@ function parse_array(schema, s)
error("NYI")
end
+ value = totype(proptype, value)
+
if value ~= nil then
table.insert(out, value);
end
@@ -180,19 +182,20 @@ local function parse(schema, s)
end
local function unparse(schema, t, current_name, current_ns)
- if schema.type == "object" then
-
- if schema.xml then
- if schema.xml.name then
- current_name = schema.xml.name
- end
- if schema.xml.namespace then
- current_ns = schema.xml.namespace
- end
+ if schema.xml then
+ if schema.xml.name then
+ current_name = schema.xml.name
+ end
+ if schema.xml.namespace then
+ current_ns = schema.xml.namespace
end
- local out = st.stanza(current_name, {xmlns = current_ns})
+ end
+
+ local out = st.stanza(current_name, {xmlns = current_ns})
+
+ if schema.type == "object" then
for prop, propschema in pairs(schema.properties) do
local v = t[prop]
@@ -264,13 +267,40 @@ local function unparse(schema, t, current_name, current_ns)
if c then
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
+ out:add_direct_child(c);
+ end
+ end
+ else
+ error("NYI")
end
end
end
end
return out
+ elseif schema.type == "array" then
+ local proptype, value_where, name, namespace = unpack_propschema(schema.items, current_name, current_ns)
+
+ if proptype == "string" then
+ for _, item in ipairs(t) do
+ if value_where == "in_text_tag" then
+ out:text_tag(name, item, {xmlns = namespace});
+ else
+ error("NYI")
+ end
+ end
+ else
+ error("NYI")
+ end
+ return out
end
end