Diff

util/datamapper.lua @ 11458:0e00fa518688

util.datamapper: Limited support for unparsing simple arrays of strings
author Kim Alvefur <zash@zash.se>
date Thu, 18 Mar 2021 13:07:10 +0100
parent 11457:6a51749af7f4
child 11461:766b0eddd12c
line wrap: on
line diff
--- a/util/datamapper.lua	Thu Mar 18 12:57:25 2021 +0100
+++ b/util/datamapper.lua	Thu Mar 18 13:07:10 2021 +0100
@@ -162,6 +162,8 @@
 			error("NYI")
 		end
 
+		value = totype(proptype, value)
+
 		if value ~= nil then
 			table.insert(out, value);
 		end
@@ -180,19 +182,20 @@
 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 @@
 						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