Software /
code /
prosody
Comparison
util/datamapper.lua @ 11435:a1fa6202fa13
util.datamapper: Library for extracting data from stanzas
Based on the XML support in the OpenAPI specification.
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Sun, 07 Mar 2021 00:57:36 +0100 |
child | 11436:5df9ffc25bb4 |
comparison
equal
deleted
inserted
replaced
11434:66d4067bdfb2 | 11435:a1fa6202fa13 |
---|---|
1 local st = require("util.stanza"); | |
2 | |
3 local function toboolean(s) | |
4 if s == "true" or s == "1" then | |
5 return true | |
6 elseif s == "false" or s == "0" then | |
7 return false | |
8 end | |
9 end | |
10 | |
11 local function parse_object(schema, s) | |
12 local out = {} | |
13 if schema.properties then | |
14 for prop, propschema in pairs(schema.properties) do | |
15 | |
16 local name = prop | |
17 local namespace = s.attr.xmlns; | |
18 local prefix = nil | |
19 local is_attribute = false | |
20 local is_text = false | |
21 | |
22 local proptype | |
23 if type(propschema) == "table" then | |
24 proptype = propschema.type | |
25 elseif type(propschema) == "string" then | |
26 proptype = propschema | |
27 end | |
28 | |
29 if type(propschema) == "table" and propschema.xml then | |
30 if propschema.xml.name then | |
31 name = propschema.xml.name | |
32 end | |
33 if propschema.xml.namespace then | |
34 namespace = propschema.xml.namespace | |
35 end | |
36 if propschema.xml.prefix then | |
37 prefix = propschema.xml.prefix | |
38 end | |
39 if propschema.xml.attribute then | |
40 is_attribute = true | |
41 elseif propschema.xml.text then | |
42 is_text = true | |
43 end | |
44 end | |
45 | |
46 if is_attribute then | |
47 local attr = name | |
48 if prefix then | |
49 attr = prefix .. ":" .. name | |
50 elseif namespace ~= s.attr.xmlns then | |
51 attr = namespace .. "\1" .. name | |
52 end | |
53 if proptype == "string" then | |
54 out[prop] = s.attr[attr] | |
55 elseif proptype == "integer" or proptype == "number" then | |
56 | |
57 out[prop] = tonumber(s.attr[attr]) | |
58 elseif proptype == "boolean" then | |
59 out[prop] = toboolean(s.attr[attr]) | |
60 | |
61 end | |
62 | |
63 elseif is_text then | |
64 if proptype == "string" then | |
65 out[prop] = s:get_text() | |
66 elseif proptype == "integer" or proptype == "number" then | |
67 out[prop] = tonumber(s:get_text()) | |
68 end | |
69 | |
70 else | |
71 | |
72 if proptype == "string" then | |
73 out[prop] = s:get_child_text(name, namespace) | |
74 elseif proptype == "integer" or proptype == "number" then | |
75 out[prop] = tonumber(s:get_child_text(name, namespace)) | |
76 elseif proptype == "object" and type(propschema) == "table" then | |
77 local c = s:get_child(name, namespace) | |
78 if c then | |
79 out[prop] = parse_object(propschema, c); | |
80 end | |
81 | |
82 end | |
83 end | |
84 end | |
85 end | |
86 | |
87 return out | |
88 end | |
89 | |
90 local function parse(schema, s) | |
91 if schema.type == "object" then | |
92 return parse_object(schema, s) | |
93 end | |
94 end | |
95 | |
96 return {parse = parse} |