Mercurial > prosody-hg
comparison util/datamapper.lua @ 11457:6a51749af7f4
util.datamapper: Add initial support for parsing arrays
| author | Kim Alvefur <zash@zash.se> |
|---|---|
| date | Thu, 18 Mar 2021 12:57:25 +0100 |
| parents | 4e376a43fe40 |
| children | 0e00fa518688 |
comparison
equal
deleted
inserted
replaced
| 11456:4e376a43fe40 | 11457:6a51749af7f4 |
|---|---|
| 36 proptype = propschema.type | 36 proptype = propschema.type |
| 37 elseif type(propschema) == "string" then | 37 elseif type(propschema) == "string" then |
| 38 proptype = propschema | 38 proptype = propschema |
| 39 end | 39 end |
| 40 | 40 |
| 41 if proptype == "object" or proptype == "array" then | |
| 42 value_where = "in_children" | |
| 43 end | |
| 44 | |
| 41 if type(propschema) == "table" then | 45 if type(propschema) == "table" then |
| 42 local xml = propschema.xml | 46 local xml = propschema.xml |
| 43 if xml then | 47 if xml then |
| 44 if xml.name then | 48 if xml.name then |
| 45 name = xml.name | 49 name = xml.name |
| 48 namespace = xml.namespace | 52 namespace = xml.namespace |
| 49 end | 53 end |
| 50 if xml.prefix then | 54 if xml.prefix then |
| 51 prefix = xml.prefix | 55 prefix = xml.prefix |
| 52 end | 56 end |
| 53 | 57 if proptype == "array" and xml.wrapped then |
| 54 if xml.attribute then | 58 value_where = "in_wrapper" |
| 59 elseif xml.attribute then | |
| 55 value_where = "in_attribute" | 60 value_where = "in_attribute" |
| 56 elseif xml.text then | 61 elseif xml.text then |
| 57 value_where = "in_text" | 62 value_where = "in_text" |
| 58 elseif xml.x_name_is_value then | 63 elseif xml.x_name_is_value then |
| 59 value_where = "in_tag_name" | 64 value_where = "in_tag_name" |
| 67 elseif propschema["enum"] then | 72 elseif propschema["enum"] then |
| 68 enums = propschema["enum"] | 73 enums = propschema["enum"] |
| 69 end | 74 end |
| 70 end | 75 end |
| 71 | 76 |
| 72 if proptype == "object" or proptype == "array" then | |
| 73 value_where = "in_children" | |
| 74 end | |
| 75 | |
| 76 return proptype, value_where, name, namespace, prefix, single_attribute, enums | 77 return proptype, value_where, name, namespace, prefix, single_attribute, enums |
| 77 end | 78 end |
| 78 | 79 |
| 79 local function parse_object(schema, s) | 80 local parse_object |
| 81 local parse_array | |
| 82 | |
| 83 function parse_object(schema, s) | |
| 80 local out = {} | 84 local out = {} |
| 81 if schema.properties then | 85 if schema.properties then |
| 82 for prop, propschema in pairs(schema.properties) do | 86 for prop, propschema in pairs(schema.properties) do |
| 83 | 87 |
| 84 local proptype, value_where, name, namespace, prefix, single_attribute, enums = unpack_propschema(propschema, prop, s.attr.xmlns) | 88 local proptype, value_where, name, namespace, prefix, single_attribute, enums = unpack_propschema(propschema, prop, s.attr.xmlns) |
| 121 if proptype == "object" then | 125 if proptype == "object" then |
| 122 local c = s:get_child(name, namespace) | 126 local c = s:get_child(name, namespace) |
| 123 if c then | 127 if c then |
| 124 out[prop] = parse_object(propschema, c); | 128 out[prop] = parse_object(propschema, c); |
| 125 end | 129 end |
| 126 | 130 elseif proptype == "array" then |
| 127 end | 131 out[prop] = parse_array(propschema, s); |
| 128 end | 132 else |
| 129 if value_where ~= "in_children" then | 133 error("unreachable") |
| 134 end | |
| 135 elseif value_where == "in_wrapper" and type(propschema) == "table" and proptype == "array" then | |
| 136 local wrapper = s:get_child(name, namespace); | |
| 137 if wrapper then | |
| 138 out[prop] = parse_array(propschema, wrapper); | |
| 139 else | |
| 140 error("unreachable") | |
| 141 end | |
| 142 else | |
| 143 error("unreachable") | |
| 144 end | |
| 145 if value_where ~= "in_children" and value_where ~= "in_wrapper" then | |
| 130 out[prop] = totype(proptype, value) | 146 out[prop] = totype(proptype, value) |
| 131 end | 147 end |
| 132 end | 148 end |
| 133 end | 149 end |
| 134 | 150 |
| 151 return out | |
| 152 end | |
| 153 | |
| 154 function parse_array(schema, s) | |
| 155 local proptype, value_where, child_name, namespace = unpack_propschema(schema.items, nil, s.attr.xmlns) | |
| 156 local out = {} | |
| 157 for c in s:childtags(child_name, namespace) do | |
| 158 local value; | |
| 159 if value_where == "in_text_tag" then | |
| 160 value = c:get_text(); | |
| 161 else | |
| 162 error("NYI") | |
| 163 end | |
| 164 | |
| 165 if value ~= nil then | |
| 166 table.insert(out, value); | |
| 167 end | |
| 168 end | |
| 135 return out | 169 return out |
| 136 end | 170 end |
| 137 | 171 |
| 138 local function parse(schema, s) | 172 local function parse(schema, s) |
| 139 if schema.type == "object" then | 173 if schema.type == "object" then |
| 140 return parse_object(schema, s) | 174 return parse_object(schema, s) |
| 175 elseif schema.type == "array" then | |
| 176 return parse_array(schema, s) | |
| 177 else | |
| 178 error("top-level scalars unsupported") | |
| 141 end | 179 end |
| 142 end | 180 end |
| 143 | 181 |
| 144 local function unparse(schema, t, current_name, current_ns) | 182 local function unparse(schema, t, current_name, current_ns) |
| 145 if schema.type == "object" then | 183 if schema.type == "object" then |
