Software / code / prosody
Comparison
util/datamapper.lua @ 11475:9bd36e871f05
util.datamapper: Factor out conversion from any value to XML string
Since this was the last severely duplicated code left.
| author | Kim Alvefur <zash@zash.se> |
|---|---|
| date | Mon, 22 Mar 2021 22:24:39 +0100 |
| parent | 11471:ab03de8e503e |
| child | 11476:83e127eb91f9 |
comparison
equal
deleted
inserted
replaced
| 11474:8fba807e5256 | 11475:9bd36e871f05 |
|---|---|
| 197 else | 197 else |
| 198 error("top-level scalars unsupported") | 198 error("top-level scalars unsupported") |
| 199 end | 199 end |
| 200 end | 200 end |
| 201 | 201 |
| 202 local function toxmlstring(proptype, v) | |
| 203 if proptype == "string" and type(v) == "string" then | |
| 204 return v | |
| 205 elseif proptype == "number" and type(v) == "number" then | |
| 206 return string.format("%g", v) | |
| 207 elseif proptype == "integer" and type(v) == "number" then | |
| 208 return string.format("%d", v) | |
| 209 elseif proptype == "boolean" then | |
| 210 return v and "1" or "0" | |
| 211 end | |
| 212 end | |
| 213 | |
| 202 local unparse | 214 local unparse |
| 203 | 215 |
| 204 local function unparse_property(out, v, proptype, propschema, value_where, name, namespace, current_ns, prefix, single_attribute) | 216 local function unparse_property(out, v, proptype, propschema, value_where, name, namespace, current_ns, prefix, single_attribute) |
| 205 if value_where == "in_attribute" then | 217 if value_where == "in_attribute" then |
| 206 local attr = name | 218 local attr = name |
| 208 attr = prefix .. ":" .. name | 220 attr = prefix .. ":" .. name |
| 209 elseif namespace ~= current_ns then | 221 elseif namespace ~= current_ns then |
| 210 attr = namespace .. "\1" .. name | 222 attr = namespace .. "\1" .. name |
| 211 end | 223 end |
| 212 | 224 |
| 213 if proptype == "string" and type(v) == "string" then | 225 out.attr[attr] = toxmlstring(proptype, v) |
| 214 out.attr[attr] = v | |
| 215 elseif proptype == "number" and type(v) == "number" then | |
| 216 out.attr[attr] = string.format("%g", v) | |
| 217 elseif proptype == "integer" and type(v) == "number" then | |
| 218 out.attr[attr] = string.format("%d", v) | |
| 219 elseif proptype == "boolean" then | |
| 220 out.attr[attr] = v and "1" or "0" | |
| 221 end | |
| 222 elseif value_where == "in_text" then | 226 elseif value_where == "in_text" then |
| 223 if type(v) == "string" then | 227 out:text(toxmlstring(proptype, v)) |
| 224 out:text(v) | |
| 225 end | |
| 226 elseif value_where == "in_single_attribute" then | 228 elseif value_where == "in_single_attribute" then |
| 227 assert(single_attribute) | 229 assert(single_attribute) |
| 228 local propattr = {} | 230 local propattr = {} |
| 229 | 231 |
| 230 if namespace ~= current_ns then | 232 if namespace ~= current_ns then |
| 231 propattr.xmlns = namespace | 233 propattr.xmlns = namespace |
| 232 end | 234 end |
| 233 | 235 |
| 234 if proptype == "string" and type(v) == "string" then | 236 propattr[single_attribute] = toxmlstring(proptype, v) |
| 235 propattr[single_attribute] = v | |
| 236 elseif proptype == "number" and type(v) == "number" then | |
| 237 propattr[single_attribute] = string.format("%g", v) | |
| 238 elseif proptype == "integer" and type(v) == "number" then | |
| 239 propattr[single_attribute] = string.format("%d", v) | |
| 240 elseif proptype == "boolean" and type(v) == "boolean" then | |
| 241 propattr[single_attribute] = v and "1" or "0" | |
| 242 end | |
| 243 out:tag(name, propattr):up(); | 237 out:tag(name, propattr):up(); |
| 244 | 238 |
| 245 else | 239 else |
| 246 local propattr | 240 local propattr |
| 247 if namespace ~= current_ns then | 241 if namespace ~= current_ns then |
| 251 if proptype == "string" and type(v) == "string" then | 245 if proptype == "string" and type(v) == "string" then |
| 252 out:tag(v, propattr):up(); | 246 out:tag(v, propattr):up(); |
| 253 elseif proptype == "boolean" and v == true then | 247 elseif proptype == "boolean" and v == true then |
| 254 out:tag(name, propattr):up(); | 248 out:tag(name, propattr):up(); |
| 255 end | 249 end |
| 256 elseif proptype == "string" and type(v) == "string" then | |
| 257 out:text_tag(name, v, propattr) | |
| 258 elseif proptype == "number" and type(v) == "number" then | |
| 259 out:text_tag(name, string.format("%g", v), propattr) | |
| 260 elseif proptype == "integer" and type(v) == "number" then | |
| 261 out:text_tag(name, string.format("%d", v), propattr) | |
| 262 elseif proptype == "boolean" and type(v) == "boolean" then | |
| 263 out:text_tag(name, v and "1" or "0", propattr) | |
| 264 elseif proptype == "object" and type(propschema) == "table" and type(v) == "table" then | 250 elseif proptype == "object" and type(propschema) == "table" and type(v) == "table" then |
| 265 local c = unparse(propschema, v, name, namespace); | 251 local c = unparse(propschema, v, name, namespace); |
| 266 if c then | 252 if c then |
| 267 out:add_direct_child(c); | 253 out:add_direct_child(c); |
| 268 end | 254 end |
| 273 out:add_direct_child(c); | 259 out:add_direct_child(c); |
| 274 end | 260 end |
| 275 else | 261 else |
| 276 unparse(propschema, v, name, namespace, out); | 262 unparse(propschema, v, name, namespace, out); |
| 277 end | 263 end |
| 264 else | |
| 265 out:text_tag(name, toxmlstring(proptype, v), propattr) | |
| 278 end | 266 end |
| 279 end | 267 end |
| 280 end | 268 end |
| 281 | 269 |
| 282 function unparse(schema, t, current_name, current_ns, ctx) | 270 function unparse(schema, t, current_name, current_ns, ctx) |