util.datamapper: Complete array building support
authorKim Alvefur <zash@zash.se>
Sat, 20 Mar 2021 21:29:51 +0100
changeset 11472 348b191cd850
parent 11471 88792dd2bee9
child 11473 087d710ed520
util.datamapper: Complete array building support
spec/util_datamapper_spec.lua
teal-src/util/datamapper.tl
util/datamapper.lua
--- a/spec/util_datamapper_spec.lua	Sat Mar 20 21:25:45 2021 +0100
+++ b/spec/util_datamapper_spec.lua	Sat Mar 20 21:29:51 2021 +0100
@@ -181,5 +181,16 @@
 			assert.equal(#x.tags-1, #u.tags)
 
 		end);
+
+		it("handles arrays", function ()
+			local u = map.unparse(disco_schema, disco);
+			assert.equal("urn:example:feature:1", u:find("{http://jabber.org/protocol/disco#info}query/feature/@var"))
+			local n = 0;
+			for child in u:get_child("query", "http://jabber.org/protocol/disco#info"):childtags("feature") do
+				n = n + 1;
+				assert.equal(string.format("urn:example:feature:%d", n), child.attr.var);
+			end
+		end);
+
 	end);
 end)
--- a/teal-src/util/datamapper.tl	Sat Mar 20 21:25:45 2021 +0100
+++ b/teal-src/util/datamapper.tl	Sat Mar 20 21:29:51 2021 +0100
@@ -323,18 +323,9 @@
 		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"
+		local proptype, value_where, name, namespace, prefix, single_attribute = unpack_propschema(schema.items, current_name, current_ns)
+		for _, item in ipairs(t as { string }) do
+			unparse_property(out, item, proptype, schema.items, value_where, name, namespace, current_ns, prefix, single_attribute)
 		end
 		return out;
 	end
--- a/util/datamapper.lua	Sat Mar 20 21:25:45 2021 +0100
+++ b/util/datamapper.lua	Sat Mar 20 21:29:51 2021 +0100
@@ -290,18 +290,9 @@
 		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")
+		local proptype, value_where, name, namespace, prefix, single_attribute = unpack_propschema(schema.items, current_name, current_ns)
+		for _, item in ipairs(t) do
+			unparse_property(out, item, proptype, schema.items, value_where, name, namespace, current_ns, prefix, single_attribute)
 		end
 		return out
 	end