Diff

util/datamapper.lua @ 11437:87a684df4b65

util.datamapper: Invent extension for using tag name as value Useful for certain enum-like uses where the element name is the relevant information, e.g. chat states.
author Kim Alvefur <zash@zash.se>
date Sat, 06 Mar 2021 23:14:23 +0100
parent 11436:5df9ffc25bb4
child 11438:b7807583de34
line wrap: on
line diff
--- a/util/datamapper.lua	Sun Mar 07 00:57:36 2021 +0100
+++ b/util/datamapper.lua	Sat Mar 06 23:14:23 2021 +0100
@@ -18,6 +18,7 @@
 			local prefix = nil
 			local is_attribute = false
 			local is_text = false
+			local name_is_value = false;
 
 			local proptype
 			if type(propschema) == "table" then
@@ -40,10 +41,17 @@
 					is_attribute = true
 				elseif propschema.xml.text then
 					is_text = true
+				elseif propschema.xml.x_name_is_value then
+					name_is_value = true
 				end
 			end
 
-			if is_attribute then
+			if name_is_value then
+				local c = s:get_child(nil, namespace);
+				if c then
+					out[prop] = c.name;
+				end
+			elseif is_attribute then
 				local attr = name
 				if prefix then
 					attr = prefix .. ":" .. name
@@ -124,6 +132,7 @@
 				local prefix = nil
 				local is_attribute = false
 				local is_text = false
+				local name_is_value = false;
 
 				if type(propschema) == "table" and propschema.xml then
 
@@ -142,6 +151,8 @@
 						is_attribute = true
 					elseif propschema.xml.text then
 						is_text = true
+					elseif propschema.xml.x_name_is_value then
+						name_is_value = true
 					end
 				end
 
@@ -171,7 +182,9 @@
 					if namespace ~= current_ns then
 						propattr = {xmlns = namespace}
 					end
-					if proptype == "string" and type(v) == "string" then
+					if name_is_value and type(v) == "string" then
+						out:tag(v, propattr):up();
+					elseif proptype == "string" and type(v) == "string" then
 						out:text_tag(name, v, propattr)
 					elseif proptype == "number" and type(v) == "number" then
 						out:text_tag(name, string.format("%g", v), propattr)