diff options
author | Kim Alvefur <zash@zash.se> | 2021-03-18 13:07:10 +0100 |
---|---|---|
committer | Kim Alvefur <zash@zash.se> | 2021-03-18 13:07:10 +0100 |
commit | 576b43151c407e03525623a143024bda8926e640 (patch) | |
tree | 6d57a0846b3fd0a04b7d3761c551c1b7aa4d3f69 /util | |
parent | c62c5b307ec907b78f309dbbe90b6569fe91a3f8 (diff) | |
download | prosody-576b43151c407e03525623a143024bda8926e640.tar.gz prosody-576b43151c407e03525623a143024bda8926e640.zip |
util.datamapper: Limited support for unparsing simple arrays of strings
Diffstat (limited to 'util')
-rw-r--r-- | util/datamapper.lua | 52 |
1 files changed, 41 insertions, 11 deletions
diff --git a/util/datamapper.lua b/util/datamapper.lua index a208dd7e..d2a6a963 100644 --- a/util/datamapper.lua +++ b/util/datamapper.lua @@ -162,6 +162,8 @@ function parse_array(schema, s) error("NYI") end + value = totype(proptype, value) + if value ~= nil then table.insert(out, value); end @@ -180,19 +182,20 @@ local function parse(schema, s) 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 @@ local function unparse(schema, t, current_name, current_ns) 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 |