aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKim Alvefur <zash@zash.se>2021-03-22 10:05:41 +0100
committerKim Alvefur <zash@zash.se>2021-03-22 10:05:41 +0100
commit6f0532b89f16874878dde97319d14970c535f5de (patch)
treea1181c4af3cac63dd66d955501e4b6254425a66c
parentf68d29bafdfce1a5deff8608c543158a4524ae91 (diff)
downloadprosody-6f0532b89f16874878dde97319d14970c535f5de.tar.gz
prosody-6f0532b89f16874878dde97319d14970c535f5de.zip
util.datamapper: Handle nested arrays or objects in arrays
-rw-r--r--teal-src/util/datamapper.tl26
-rw-r--r--util/datamapper.lua26
2 files changed, 44 insertions, 8 deletions
diff --git a/teal-src/util/datamapper.tl b/teal-src/util/datamapper.tl
index 1cc165e0..3b652639 100644
--- a/teal-src/util/datamapper.tl
+++ b/teal-src/util/datamapper.tl
@@ -188,17 +188,35 @@ function parse_object (schema : schema_t, s : st.stanza_t) : { string : any }
end
function parse_array (schema : json_schema_object, s : st.stanza_t) : { any }
- local proptype, value_where, child_name, namespace, prefix, single_attribute, enums = unpack_propschema(schema.items, nil, s.attr.xmlns)
+ local itemschema : schema_t = schema.items;
+ local proptype, value_where, child_name, namespace, prefix, single_attribute, enums = unpack_propschema(itemschema, nil, s.attr.xmlns)
local attr_name : string
if value_where == "in_single_attribute" then -- FIXME this shouldn't be needed
value_where = "in_attribute";
attr_name = single_attribute;
end
local out : { any } = {}
- for c in s:childtags(child_name, namespace) do
- local value : string = extract_value (c, value_where, proptype, attr_name or child_name, namespace, prefix, single_attribute, enums)
- table.insert(out, totype(proptype, value));
+ if proptype == "object" then
+ if itemschema is json_schema_object then
+ for c in s:childtags(child_name, namespace) do
+ table.insert(out, parse_object(itemschema, c));
+ end
+ else
+ error "array items must be schema object"
+ end
+ elseif proptype == "array" then
+ if itemschema is json_schema_object then
+ for c in s:childtags(child_name, namespace) do
+ table.insert(out, parse_array(itemschema, c));
+ end
+ end
+ else
+ for c in s:childtags(child_name, namespace) do
+ local value : string = extract_value (c, value_where, proptype, attr_name or child_name, namespace, prefix, single_attribute, enums)
+
+ table.insert(out, totype(proptype, value));
+ end
end
return out;
end
diff --git a/util/datamapper.lua b/util/datamapper.lua
index d989c75f..96b4a42e 100644
--- a/util/datamapper.lua
+++ b/util/datamapper.lua
@@ -156,17 +156,35 @@ function parse_object(schema, s)
end
function parse_array(schema, s)
- local proptype, value_where, child_name, namespace, prefix, single_attribute, enums = unpack_propschema(schema.items, nil, s.attr.xmlns)
+ local itemschema = schema.items;
+ local proptype, value_where, child_name, namespace, prefix, single_attribute, enums = unpack_propschema(itemschema, nil, s.attr.xmlns)
local attr_name
if value_where == "in_single_attribute" then
value_where = "in_attribute";
attr_name = single_attribute;
end
local out = {}
- for c in s:childtags(child_name, namespace) do
- local value = extract_value(c, value_where, proptype, attr_name or child_name, namespace, prefix, single_attribute, enums)
- table.insert(out, totype(proptype, value));
+ if proptype == "object" then
+ if type(itemschema) == "table" then
+ for c in s:childtags(child_name, namespace) do
+ table.insert(out, parse_object(itemschema, c));
+ end
+ else
+ error("array items must be schema object")
+ end
+ elseif proptype == "array" then
+ if type(itemschema) == "table" then
+ for c in s:childtags(child_name, namespace) do
+ table.insert(out, parse_array(itemschema, c));
+ end
+ end
+ else
+ for c in s:childtags(child_name, namespace) do
+ local value = extract_value(c, value_where, proptype, attr_name or child_name, namespace, prefix, single_attribute, enums)
+
+ table.insert(out, totype(proptype, value));
+ end
end
return out
end