util.datamapper: Handle nested arrays or objects in arrays
authorKim Alvefur <zash@zash.se>
Mon, 22 Mar 2021 10:05:41 +0100
changeset 11475 ab03de8e503e
parent 11474 5ebad952ebf7
child 11476 c32753ceb0f0
util.datamapper: Handle nested arrays or objects in arrays
teal-src/util/datamapper.tl
util/datamapper.lua
--- a/teal-src/util/datamapper.tl	Mon Mar 22 10:03:32 2021 +0100
+++ b/teal-src/util/datamapper.tl	Mon Mar 22 10:05:41 2021 +0100
@@ -188,17 +188,35 @@
 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
--- a/util/datamapper.lua	Mon Mar 22 10:03:32 2021 +0100
+++ b/util/datamapper.lua	Mon Mar 22 10:05:41 2021 +0100
@@ -156,17 +156,35 @@
 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