Software /
code /
prosody
Annotate
util/datamapper.lua @ 11772:e2155e2703dd
mod_s2s: Factor out procedure for newly encrypted sessions
Goal is to call this if the connection is using Direct TLS, either via
multiplexing or a future Direct TLS S2S port.
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Tue, 10 Aug 2021 20:51:31 +0200 |
parent | 11481:b2f9782497dd |
child | 12133:11060c8919b6 |
rev | line source |
---|---|
11435
a1fa6202fa13
util.datamapper: Library for extracting data from stanzas
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
1 local st = require("util.stanza"); |
a1fa6202fa13
util.datamapper: Library for extracting data from stanzas
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
2 |
11462
d1982b7eb00d
util.datamapper: Fix arrays nesting one level too deep
Kim Alvefur <zash@zash.se>
parents:
11461
diff
changeset
|
3 local schema_t = {} |
d1982b7eb00d
util.datamapper: Fix arrays nesting one level too deep
Kim Alvefur <zash@zash.se>
parents:
11461
diff
changeset
|
4 |
11435
a1fa6202fa13
util.datamapper: Library for extracting data from stanzas
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
5 local function toboolean(s) |
a1fa6202fa13
util.datamapper: Library for extracting data from stanzas
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
6 if s == "true" or s == "1" then |
a1fa6202fa13
util.datamapper: Library for extracting data from stanzas
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
7 return true |
a1fa6202fa13
util.datamapper: Library for extracting data from stanzas
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
8 elseif s == "false" or s == "0" then |
a1fa6202fa13
util.datamapper: Library for extracting data from stanzas
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
9 return false |
11455
a5050e21ab08
util.datamapper: Separate extraction of xml from coercion to target type
Kim Alvefur <zash@zash.se>
parents:
11454
diff
changeset
|
10 elseif s then |
a5050e21ab08
util.datamapper: Separate extraction of xml from coercion to target type
Kim Alvefur <zash@zash.se>
parents:
11454
diff
changeset
|
11 return true |
a5050e21ab08
util.datamapper: Separate extraction of xml from coercion to target type
Kim Alvefur <zash@zash.se>
parents:
11454
diff
changeset
|
12 end |
a5050e21ab08
util.datamapper: Separate extraction of xml from coercion to target type
Kim Alvefur <zash@zash.se>
parents:
11454
diff
changeset
|
13 end |
a5050e21ab08
util.datamapper: Separate extraction of xml from coercion to target type
Kim Alvefur <zash@zash.se>
parents:
11454
diff
changeset
|
14 |
a5050e21ab08
util.datamapper: Separate extraction of xml from coercion to target type
Kim Alvefur <zash@zash.se>
parents:
11454
diff
changeset
|
15 local function totype(t, s) |
11479
377a9eaf7bef
util.datamapper: Fix error on attempt to coerce nil to something
Kim Alvefur <zash@zash.se>
parents:
11476
diff
changeset
|
16 if not s then |
377a9eaf7bef
util.datamapper: Fix error on attempt to coerce nil to something
Kim Alvefur <zash@zash.se>
parents:
11476
diff
changeset
|
17 return nil |
377a9eaf7bef
util.datamapper: Fix error on attempt to coerce nil to something
Kim Alvefur <zash@zash.se>
parents:
11476
diff
changeset
|
18 end |
11455
a5050e21ab08
util.datamapper: Separate extraction of xml from coercion to target type
Kim Alvefur <zash@zash.se>
parents:
11454
diff
changeset
|
19 if t == "string" then |
a5050e21ab08
util.datamapper: Separate extraction of xml from coercion to target type
Kim Alvefur <zash@zash.se>
parents:
11454
diff
changeset
|
20 return s |
a5050e21ab08
util.datamapper: Separate extraction of xml from coercion to target type
Kim Alvefur <zash@zash.se>
parents:
11454
diff
changeset
|
21 elseif t == "boolean" then |
a5050e21ab08
util.datamapper: Separate extraction of xml from coercion to target type
Kim Alvefur <zash@zash.se>
parents:
11454
diff
changeset
|
22 return toboolean(s) |
a5050e21ab08
util.datamapper: Separate extraction of xml from coercion to target type
Kim Alvefur <zash@zash.se>
parents:
11454
diff
changeset
|
23 elseif t == "number" or t == "integer" then |
a5050e21ab08
util.datamapper: Separate extraction of xml from coercion to target type
Kim Alvefur <zash@zash.se>
parents:
11454
diff
changeset
|
24 return tonumber(s) |
11435
a1fa6202fa13
util.datamapper: Library for extracting data from stanzas
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
25 end |
a1fa6202fa13
util.datamapper: Library for extracting data from stanzas
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
26 end |
a1fa6202fa13
util.datamapper: Library for extracting data from stanzas
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
27 |
11454
1d9c1893cc5e
util.datamapper: Use enum instead of mutually exclusive booleans
Kim Alvefur <zash@zash.se>
parents:
11453
diff
changeset
|
28 local value_goes = {} |
1d9c1893cc5e
util.datamapper: Use enum instead of mutually exclusive booleans
Kim Alvefur <zash@zash.se>
parents:
11453
diff
changeset
|
29 |
11456
4e376a43fe40
util.datamapper: Factor out common schema unpacking
Kim Alvefur <zash@zash.se>
parents:
11455
diff
changeset
|
30 local function unpack_propschema(propschema, propname, current_ns) |
4e376a43fe40
util.datamapper: Factor out common schema unpacking
Kim Alvefur <zash@zash.se>
parents:
11455
diff
changeset
|
31 |
4e376a43fe40
util.datamapper: Factor out common schema unpacking
Kim Alvefur <zash@zash.se>
parents:
11455
diff
changeset
|
32 local proptype = "string" |
11466
c098d07e6717
util.datamapper: Finally implement support for parsing arrays
Kim Alvefur <zash@zash.se>
parents:
11465
diff
changeset
|
33 local value_where = propname and "in_text_tag" or "in_text" |
11456
4e376a43fe40
util.datamapper: Factor out common schema unpacking
Kim Alvefur <zash@zash.se>
parents:
11455
diff
changeset
|
34 local name = propname |
11476
83e127eb91f9
util.datamapper: Deal with locally built stanzas missing xmlns
Kim Alvefur <zash@zash.se>
parents:
11475
diff
changeset
|
35 local namespace |
11456
4e376a43fe40
util.datamapper: Factor out common schema unpacking
Kim Alvefur <zash@zash.se>
parents:
11455
diff
changeset
|
36 local prefix |
4e376a43fe40
util.datamapper: Factor out common schema unpacking
Kim Alvefur <zash@zash.se>
parents:
11455
diff
changeset
|
37 local single_attribute |
4e376a43fe40
util.datamapper: Factor out common schema unpacking
Kim Alvefur <zash@zash.se>
parents:
11455
diff
changeset
|
38 local enums |
4e376a43fe40
util.datamapper: Factor out common schema unpacking
Kim Alvefur <zash@zash.se>
parents:
11455
diff
changeset
|
39 |
4e376a43fe40
util.datamapper: Factor out common schema unpacking
Kim Alvefur <zash@zash.se>
parents:
11455
diff
changeset
|
40 if type(propschema) == "table" then |
4e376a43fe40
util.datamapper: Factor out common schema unpacking
Kim Alvefur <zash@zash.se>
parents:
11455
diff
changeset
|
41 proptype = propschema.type |
4e376a43fe40
util.datamapper: Factor out common schema unpacking
Kim Alvefur <zash@zash.se>
parents:
11455
diff
changeset
|
42 elseif type(propschema) == "string" then |
4e376a43fe40
util.datamapper: Factor out common schema unpacking
Kim Alvefur <zash@zash.se>
parents:
11455
diff
changeset
|
43 proptype = propschema |
4e376a43fe40
util.datamapper: Factor out common schema unpacking
Kim Alvefur <zash@zash.se>
parents:
11455
diff
changeset
|
44 end |
4e376a43fe40
util.datamapper: Factor out common schema unpacking
Kim Alvefur <zash@zash.se>
parents:
11455
diff
changeset
|
45 |
11457
6a51749af7f4
util.datamapper: Add initial support for parsing arrays
Kim Alvefur <zash@zash.se>
parents:
11456
diff
changeset
|
46 if proptype == "object" or proptype == "array" then |
6a51749af7f4
util.datamapper: Add initial support for parsing arrays
Kim Alvefur <zash@zash.se>
parents:
11456
diff
changeset
|
47 value_where = "in_children" |
6a51749af7f4
util.datamapper: Add initial support for parsing arrays
Kim Alvefur <zash@zash.se>
parents:
11456
diff
changeset
|
48 end |
6a51749af7f4
util.datamapper: Add initial support for parsing arrays
Kim Alvefur <zash@zash.se>
parents:
11456
diff
changeset
|
49 |
11456
4e376a43fe40
util.datamapper: Factor out common schema unpacking
Kim Alvefur <zash@zash.se>
parents:
11455
diff
changeset
|
50 if type(propschema) == "table" then |
4e376a43fe40
util.datamapper: Factor out common schema unpacking
Kim Alvefur <zash@zash.se>
parents:
11455
diff
changeset
|
51 local xml = propschema.xml |
4e376a43fe40
util.datamapper: Factor out common schema unpacking
Kim Alvefur <zash@zash.se>
parents:
11455
diff
changeset
|
52 if xml then |
4e376a43fe40
util.datamapper: Factor out common schema unpacking
Kim Alvefur <zash@zash.se>
parents:
11455
diff
changeset
|
53 if xml.name then |
4e376a43fe40
util.datamapper: Factor out common schema unpacking
Kim Alvefur <zash@zash.se>
parents:
11455
diff
changeset
|
54 name = xml.name |
4e376a43fe40
util.datamapper: Factor out common schema unpacking
Kim Alvefur <zash@zash.se>
parents:
11455
diff
changeset
|
55 end |
11476
83e127eb91f9
util.datamapper: Deal with locally built stanzas missing xmlns
Kim Alvefur <zash@zash.se>
parents:
11475
diff
changeset
|
56 if xml.namespace and xml.namespace ~= current_ns then |
11456
4e376a43fe40
util.datamapper: Factor out common schema unpacking
Kim Alvefur <zash@zash.se>
parents:
11455
diff
changeset
|
57 namespace = xml.namespace |
4e376a43fe40
util.datamapper: Factor out common schema unpacking
Kim Alvefur <zash@zash.se>
parents:
11455
diff
changeset
|
58 end |
4e376a43fe40
util.datamapper: Factor out common schema unpacking
Kim Alvefur <zash@zash.se>
parents:
11455
diff
changeset
|
59 if xml.prefix then |
4e376a43fe40
util.datamapper: Factor out common schema unpacking
Kim Alvefur <zash@zash.se>
parents:
11455
diff
changeset
|
60 prefix = xml.prefix |
4e376a43fe40
util.datamapper: Factor out common schema unpacking
Kim Alvefur <zash@zash.se>
parents:
11455
diff
changeset
|
61 end |
11457
6a51749af7f4
util.datamapper: Add initial support for parsing arrays
Kim Alvefur <zash@zash.se>
parents:
11456
diff
changeset
|
62 if proptype == "array" and xml.wrapped then |
6a51749af7f4
util.datamapper: Add initial support for parsing arrays
Kim Alvefur <zash@zash.se>
parents:
11456
diff
changeset
|
63 value_where = "in_wrapper" |
6a51749af7f4
util.datamapper: Add initial support for parsing arrays
Kim Alvefur <zash@zash.se>
parents:
11456
diff
changeset
|
64 elseif xml.attribute then |
11456
4e376a43fe40
util.datamapper: Factor out common schema unpacking
Kim Alvefur <zash@zash.se>
parents:
11455
diff
changeset
|
65 value_where = "in_attribute" |
4e376a43fe40
util.datamapper: Factor out common schema unpacking
Kim Alvefur <zash@zash.se>
parents:
11455
diff
changeset
|
66 elseif xml.text then |
4e376a43fe40
util.datamapper: Factor out common schema unpacking
Kim Alvefur <zash@zash.se>
parents:
11455
diff
changeset
|
67 value_where = "in_text" |
4e376a43fe40
util.datamapper: Factor out common schema unpacking
Kim Alvefur <zash@zash.se>
parents:
11455
diff
changeset
|
68 elseif xml.x_name_is_value then |
4e376a43fe40
util.datamapper: Factor out common schema unpacking
Kim Alvefur <zash@zash.se>
parents:
11455
diff
changeset
|
69 value_where = "in_tag_name" |
4e376a43fe40
util.datamapper: Factor out common schema unpacking
Kim Alvefur <zash@zash.se>
parents:
11455
diff
changeset
|
70 elseif xml.x_single_attribute then |
4e376a43fe40
util.datamapper: Factor out common schema unpacking
Kim Alvefur <zash@zash.se>
parents:
11455
diff
changeset
|
71 single_attribute = xml.x_single_attribute |
4e376a43fe40
util.datamapper: Factor out common schema unpacking
Kim Alvefur <zash@zash.se>
parents:
11455
diff
changeset
|
72 value_where = "in_single_attribute" |
4e376a43fe40
util.datamapper: Factor out common schema unpacking
Kim Alvefur <zash@zash.se>
parents:
11455
diff
changeset
|
73 end |
4e376a43fe40
util.datamapper: Factor out common schema unpacking
Kim Alvefur <zash@zash.se>
parents:
11455
diff
changeset
|
74 end |
4e376a43fe40
util.datamapper: Factor out common schema unpacking
Kim Alvefur <zash@zash.se>
parents:
11455
diff
changeset
|
75 if propschema["const"] then |
4e376a43fe40
util.datamapper: Factor out common schema unpacking
Kim Alvefur <zash@zash.se>
parents:
11455
diff
changeset
|
76 enums = {propschema["const"]} |
4e376a43fe40
util.datamapper: Factor out common schema unpacking
Kim Alvefur <zash@zash.se>
parents:
11455
diff
changeset
|
77 elseif propschema["enum"] then |
4e376a43fe40
util.datamapper: Factor out common schema unpacking
Kim Alvefur <zash@zash.se>
parents:
11455
diff
changeset
|
78 enums = propschema["enum"] |
4e376a43fe40
util.datamapper: Factor out common schema unpacking
Kim Alvefur <zash@zash.se>
parents:
11455
diff
changeset
|
79 end |
4e376a43fe40
util.datamapper: Factor out common schema unpacking
Kim Alvefur <zash@zash.se>
parents:
11455
diff
changeset
|
80 end |
4e376a43fe40
util.datamapper: Factor out common schema unpacking
Kim Alvefur <zash@zash.se>
parents:
11455
diff
changeset
|
81 |
4e376a43fe40
util.datamapper: Factor out common schema unpacking
Kim Alvefur <zash@zash.se>
parents:
11455
diff
changeset
|
82 return proptype, value_where, name, namespace, prefix, single_attribute, enums |
4e376a43fe40
util.datamapper: Factor out common schema unpacking
Kim Alvefur <zash@zash.se>
parents:
11455
diff
changeset
|
83 end |
4e376a43fe40
util.datamapper: Factor out common schema unpacking
Kim Alvefur <zash@zash.se>
parents:
11455
diff
changeset
|
84 |
11457
6a51749af7f4
util.datamapper: Add initial support for parsing arrays
Kim Alvefur <zash@zash.se>
parents:
11456
diff
changeset
|
85 local parse_object |
6a51749af7f4
util.datamapper: Add initial support for parsing arrays
Kim Alvefur <zash@zash.se>
parents:
11456
diff
changeset
|
86 local parse_array |
6a51749af7f4
util.datamapper: Add initial support for parsing arrays
Kim Alvefur <zash@zash.se>
parents:
11456
diff
changeset
|
87 |
11465
19a88b61ab4e
util.datamapper: Factor out extraction of the XML part to use
Kim Alvefur <zash@zash.se>
parents:
11464
diff
changeset
|
88 local function extract_value(s, value_where, proptype, name, namespace, prefix, single_attribute, enums) |
19a88b61ab4e
util.datamapper: Factor out extraction of the XML part to use
Kim Alvefur <zash@zash.se>
parents:
11464
diff
changeset
|
89 if value_where == "in_tag_name" then |
19a88b61ab4e
util.datamapper: Factor out extraction of the XML part to use
Kim Alvefur <zash@zash.se>
parents:
11464
diff
changeset
|
90 local c |
19a88b61ab4e
util.datamapper: Factor out extraction of the XML part to use
Kim Alvefur <zash@zash.se>
parents:
11464
diff
changeset
|
91 if proptype == "boolean" then |
19a88b61ab4e
util.datamapper: Factor out extraction of the XML part to use
Kim Alvefur <zash@zash.se>
parents:
11464
diff
changeset
|
92 c = s:get_child(name, namespace); |
19a88b61ab4e
util.datamapper: Factor out extraction of the XML part to use
Kim Alvefur <zash@zash.se>
parents:
11464
diff
changeset
|
93 elseif enums and proptype == "string" then |
19a88b61ab4e
util.datamapper: Factor out extraction of the XML part to use
Kim Alvefur <zash@zash.se>
parents:
11464
diff
changeset
|
94 |
19a88b61ab4e
util.datamapper: Factor out extraction of the XML part to use
Kim Alvefur <zash@zash.se>
parents:
11464
diff
changeset
|
95 for i = 1, #enums do |
19a88b61ab4e
util.datamapper: Factor out extraction of the XML part to use
Kim Alvefur <zash@zash.se>
parents:
11464
diff
changeset
|
96 c = s:get_child(enums[i], namespace); |
19a88b61ab4e
util.datamapper: Factor out extraction of the XML part to use
Kim Alvefur <zash@zash.se>
parents:
11464
diff
changeset
|
97 if c then |
19a88b61ab4e
util.datamapper: Factor out extraction of the XML part to use
Kim Alvefur <zash@zash.se>
parents:
11464
diff
changeset
|
98 break |
19a88b61ab4e
util.datamapper: Factor out extraction of the XML part to use
Kim Alvefur <zash@zash.se>
parents:
11464
diff
changeset
|
99 end |
19a88b61ab4e
util.datamapper: Factor out extraction of the XML part to use
Kim Alvefur <zash@zash.se>
parents:
11464
diff
changeset
|
100 end |
19a88b61ab4e
util.datamapper: Factor out extraction of the XML part to use
Kim Alvefur <zash@zash.se>
parents:
11464
diff
changeset
|
101 else |
19a88b61ab4e
util.datamapper: Factor out extraction of the XML part to use
Kim Alvefur <zash@zash.se>
parents:
11464
diff
changeset
|
102 c = s:get_child(nil, namespace); |
19a88b61ab4e
util.datamapper: Factor out extraction of the XML part to use
Kim Alvefur <zash@zash.se>
parents:
11464
diff
changeset
|
103 end |
19a88b61ab4e
util.datamapper: Factor out extraction of the XML part to use
Kim Alvefur <zash@zash.se>
parents:
11464
diff
changeset
|
104 if c then |
19a88b61ab4e
util.datamapper: Factor out extraction of the XML part to use
Kim Alvefur <zash@zash.se>
parents:
11464
diff
changeset
|
105 return c.name |
19a88b61ab4e
util.datamapper: Factor out extraction of the XML part to use
Kim Alvefur <zash@zash.se>
parents:
11464
diff
changeset
|
106 end |
19a88b61ab4e
util.datamapper: Factor out extraction of the XML part to use
Kim Alvefur <zash@zash.se>
parents:
11464
diff
changeset
|
107 elseif value_where == "in_attribute" then |
19a88b61ab4e
util.datamapper: Factor out extraction of the XML part to use
Kim Alvefur <zash@zash.se>
parents:
11464
diff
changeset
|
108 local attr = name |
19a88b61ab4e
util.datamapper: Factor out extraction of the XML part to use
Kim Alvefur <zash@zash.se>
parents:
11464
diff
changeset
|
109 if prefix then |
19a88b61ab4e
util.datamapper: Factor out extraction of the XML part to use
Kim Alvefur <zash@zash.se>
parents:
11464
diff
changeset
|
110 attr = prefix .. ":" .. name |
11476
83e127eb91f9
util.datamapper: Deal with locally built stanzas missing xmlns
Kim Alvefur <zash@zash.se>
parents:
11475
diff
changeset
|
111 elseif namespace and namespace ~= s.attr.xmlns then |
11465
19a88b61ab4e
util.datamapper: Factor out extraction of the XML part to use
Kim Alvefur <zash@zash.se>
parents:
11464
diff
changeset
|
112 attr = namespace .. "\1" .. name |
19a88b61ab4e
util.datamapper: Factor out extraction of the XML part to use
Kim Alvefur <zash@zash.se>
parents:
11464
diff
changeset
|
113 end |
19a88b61ab4e
util.datamapper: Factor out extraction of the XML part to use
Kim Alvefur <zash@zash.se>
parents:
11464
diff
changeset
|
114 return s.attr[attr] |
19a88b61ab4e
util.datamapper: Factor out extraction of the XML part to use
Kim Alvefur <zash@zash.se>
parents:
11464
diff
changeset
|
115 |
19a88b61ab4e
util.datamapper: Factor out extraction of the XML part to use
Kim Alvefur <zash@zash.se>
parents:
11464
diff
changeset
|
116 elseif value_where == "in_text" then |
19a88b61ab4e
util.datamapper: Factor out extraction of the XML part to use
Kim Alvefur <zash@zash.se>
parents:
11464
diff
changeset
|
117 return s:get_text() |
19a88b61ab4e
util.datamapper: Factor out extraction of the XML part to use
Kim Alvefur <zash@zash.se>
parents:
11464
diff
changeset
|
118 |
19a88b61ab4e
util.datamapper: Factor out extraction of the XML part to use
Kim Alvefur <zash@zash.se>
parents:
11464
diff
changeset
|
119 elseif value_where == "in_single_attribute" then |
19a88b61ab4e
util.datamapper: Factor out extraction of the XML part to use
Kim Alvefur <zash@zash.se>
parents:
11464
diff
changeset
|
120 local c = s:get_child(name, namespace) |
19a88b61ab4e
util.datamapper: Factor out extraction of the XML part to use
Kim Alvefur <zash@zash.se>
parents:
11464
diff
changeset
|
121 return c and c.attr[single_attribute] |
19a88b61ab4e
util.datamapper: Factor out extraction of the XML part to use
Kim Alvefur <zash@zash.se>
parents:
11464
diff
changeset
|
122 elseif value_where == "in_text_tag" then |
19a88b61ab4e
util.datamapper: Factor out extraction of the XML part to use
Kim Alvefur <zash@zash.se>
parents:
11464
diff
changeset
|
123 return s:get_child_text(name, namespace) |
19a88b61ab4e
util.datamapper: Factor out extraction of the XML part to use
Kim Alvefur <zash@zash.se>
parents:
11464
diff
changeset
|
124 end |
19a88b61ab4e
util.datamapper: Factor out extraction of the XML part to use
Kim Alvefur <zash@zash.se>
parents:
11464
diff
changeset
|
125 end |
19a88b61ab4e
util.datamapper: Factor out extraction of the XML part to use
Kim Alvefur <zash@zash.se>
parents:
11464
diff
changeset
|
126 |
11457
6a51749af7f4
util.datamapper: Add initial support for parsing arrays
Kim Alvefur <zash@zash.se>
parents:
11456
diff
changeset
|
127 function parse_object(schema, s) |
11435
a1fa6202fa13
util.datamapper: Library for extracting data from stanzas
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
128 local out = {} |
11461
766b0eddd12c
util.datamapper: Deal with type name changes in util.jsonschema
Kim Alvefur <zash@zash.se>
parents:
11458
diff
changeset
|
129 if type(schema) == "table" and schema.properties then |
11435
a1fa6202fa13
util.datamapper: Library for extracting data from stanzas
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
130 for prop, propschema in pairs(schema.properties) do |
a1fa6202fa13
util.datamapper: Library for extracting data from stanzas
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
131 |
11456
4e376a43fe40
util.datamapper: Factor out common schema unpacking
Kim Alvefur <zash@zash.se>
parents:
11455
diff
changeset
|
132 local proptype, value_where, name, namespace, prefix, single_attribute, enums = unpack_propschema(propschema, prop, s.attr.xmlns) |
11435
a1fa6202fa13
util.datamapper: Library for extracting data from stanzas
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
133 |
11465
19a88b61ab4e
util.datamapper: Factor out extraction of the XML part to use
Kim Alvefur <zash@zash.se>
parents:
11464
diff
changeset
|
134 if value_where == "in_children" and type(propschema) == "table" then |
11455
a5050e21ab08
util.datamapper: Separate extraction of xml from coercion to target type
Kim Alvefur <zash@zash.se>
parents:
11454
diff
changeset
|
135 if proptype == "object" then |
11435
a1fa6202fa13
util.datamapper: Library for extracting data from stanzas
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
136 local c = s:get_child(name, namespace) |
a1fa6202fa13
util.datamapper: Library for extracting data from stanzas
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
137 if c then |
a1fa6202fa13
util.datamapper: Library for extracting data from stanzas
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
138 out[prop] = parse_object(propschema, c); |
a1fa6202fa13
util.datamapper: Library for extracting data from stanzas
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
139 end |
11457
6a51749af7f4
util.datamapper: Add initial support for parsing arrays
Kim Alvefur <zash@zash.se>
parents:
11456
diff
changeset
|
140 elseif proptype == "array" then |
11481
b2f9782497dd
util.datamapper: Don't include empty unwrapped arrays
Kim Alvefur <zash@zash.se>
parents:
11479
diff
changeset
|
141 local a = parse_array(propschema, s); |
b2f9782497dd
util.datamapper: Don't include empty unwrapped arrays
Kim Alvefur <zash@zash.se>
parents:
11479
diff
changeset
|
142 if a and a[1] ~= nil then |
b2f9782497dd
util.datamapper: Don't include empty unwrapped arrays
Kim Alvefur <zash@zash.se>
parents:
11479
diff
changeset
|
143 out[prop] = a; |
b2f9782497dd
util.datamapper: Don't include empty unwrapped arrays
Kim Alvefur <zash@zash.se>
parents:
11479
diff
changeset
|
144 end |
11457
6a51749af7f4
util.datamapper: Add initial support for parsing arrays
Kim Alvefur <zash@zash.se>
parents:
11456
diff
changeset
|
145 else |
6a51749af7f4
util.datamapper: Add initial support for parsing arrays
Kim Alvefur <zash@zash.se>
parents:
11456
diff
changeset
|
146 error("unreachable") |
11435
a1fa6202fa13
util.datamapper: Library for extracting data from stanzas
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
147 end |
11457
6a51749af7f4
util.datamapper: Add initial support for parsing arrays
Kim Alvefur <zash@zash.se>
parents:
11456
diff
changeset
|
148 elseif value_where == "in_wrapper" and type(propschema) == "table" and proptype == "array" then |
6a51749af7f4
util.datamapper: Add initial support for parsing arrays
Kim Alvefur <zash@zash.se>
parents:
11456
diff
changeset
|
149 local wrapper = s:get_child(name, namespace); |
6a51749af7f4
util.datamapper: Add initial support for parsing arrays
Kim Alvefur <zash@zash.se>
parents:
11456
diff
changeset
|
150 if wrapper then |
6a51749af7f4
util.datamapper: Add initial support for parsing arrays
Kim Alvefur <zash@zash.se>
parents:
11456
diff
changeset
|
151 out[prop] = parse_array(propschema, wrapper); |
6a51749af7f4
util.datamapper: Add initial support for parsing arrays
Kim Alvefur <zash@zash.se>
parents:
11456
diff
changeset
|
152 end |
6a51749af7f4
util.datamapper: Add initial support for parsing arrays
Kim Alvefur <zash@zash.se>
parents:
11456
diff
changeset
|
153 else |
11465
19a88b61ab4e
util.datamapper: Factor out extraction of the XML part to use
Kim Alvefur <zash@zash.se>
parents:
11464
diff
changeset
|
154 local value = extract_value(s, value_where, proptype, name, namespace, prefix, single_attribute, enums) |
19a88b61ab4e
util.datamapper: Factor out extraction of the XML part to use
Kim Alvefur <zash@zash.se>
parents:
11464
diff
changeset
|
155 |
11455
a5050e21ab08
util.datamapper: Separate extraction of xml from coercion to target type
Kim Alvefur <zash@zash.se>
parents:
11454
diff
changeset
|
156 out[prop] = totype(proptype, value) |
a5050e21ab08
util.datamapper: Separate extraction of xml from coercion to target type
Kim Alvefur <zash@zash.se>
parents:
11454
diff
changeset
|
157 end |
11435
a1fa6202fa13
util.datamapper: Library for extracting data from stanzas
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
158 end |
a1fa6202fa13
util.datamapper: Library for extracting data from stanzas
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
159 end |
a1fa6202fa13
util.datamapper: Library for extracting data from stanzas
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
160 |
a1fa6202fa13
util.datamapper: Library for extracting data from stanzas
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
161 return out |
a1fa6202fa13
util.datamapper: Library for extracting data from stanzas
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
162 end |
a1fa6202fa13
util.datamapper: Library for extracting data from stanzas
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
163 |
11457
6a51749af7f4
util.datamapper: Add initial support for parsing arrays
Kim Alvefur <zash@zash.se>
parents:
11456
diff
changeset
|
164 function parse_array(schema, s) |
11471
ab03de8e503e
util.datamapper: Handle nested arrays or objects in arrays
Kim Alvefur <zash@zash.se>
parents:
11470
diff
changeset
|
165 local itemschema = schema.items; |
ab03de8e503e
util.datamapper: Handle nested arrays or objects in arrays
Kim Alvefur <zash@zash.se>
parents:
11470
diff
changeset
|
166 local proptype, value_where, child_name, namespace, prefix, single_attribute, enums = unpack_propschema(itemschema, nil, s.attr.xmlns) |
11466
c098d07e6717
util.datamapper: Finally implement support for parsing arrays
Kim Alvefur <zash@zash.se>
parents:
11465
diff
changeset
|
167 local attr_name |
c098d07e6717
util.datamapper: Finally implement support for parsing arrays
Kim Alvefur <zash@zash.se>
parents:
11465
diff
changeset
|
168 if value_where == "in_single_attribute" then |
c098d07e6717
util.datamapper: Finally implement support for parsing arrays
Kim Alvefur <zash@zash.se>
parents:
11465
diff
changeset
|
169 value_where = "in_attribute"; |
c098d07e6717
util.datamapper: Finally implement support for parsing arrays
Kim Alvefur <zash@zash.se>
parents:
11465
diff
changeset
|
170 attr_name = single_attribute; |
c098d07e6717
util.datamapper: Finally implement support for parsing arrays
Kim Alvefur <zash@zash.se>
parents:
11465
diff
changeset
|
171 end |
11457
6a51749af7f4
util.datamapper: Add initial support for parsing arrays
Kim Alvefur <zash@zash.se>
parents:
11456
diff
changeset
|
172 local out = {} |
6a51749af7f4
util.datamapper: Add initial support for parsing arrays
Kim Alvefur <zash@zash.se>
parents:
11456
diff
changeset
|
173 |
11471
ab03de8e503e
util.datamapper: Handle nested arrays or objects in arrays
Kim Alvefur <zash@zash.se>
parents:
11470
diff
changeset
|
174 if proptype == "object" then |
ab03de8e503e
util.datamapper: Handle nested arrays or objects in arrays
Kim Alvefur <zash@zash.se>
parents:
11470
diff
changeset
|
175 if type(itemschema) == "table" then |
ab03de8e503e
util.datamapper: Handle nested arrays or objects in arrays
Kim Alvefur <zash@zash.se>
parents:
11470
diff
changeset
|
176 for c in s:childtags(child_name, namespace) do |
ab03de8e503e
util.datamapper: Handle nested arrays or objects in arrays
Kim Alvefur <zash@zash.se>
parents:
11470
diff
changeset
|
177 table.insert(out, parse_object(itemschema, c)); |
ab03de8e503e
util.datamapper: Handle nested arrays or objects in arrays
Kim Alvefur <zash@zash.se>
parents:
11470
diff
changeset
|
178 end |
ab03de8e503e
util.datamapper: Handle nested arrays or objects in arrays
Kim Alvefur <zash@zash.se>
parents:
11470
diff
changeset
|
179 else |
ab03de8e503e
util.datamapper: Handle nested arrays or objects in arrays
Kim Alvefur <zash@zash.se>
parents:
11470
diff
changeset
|
180 error("array items must be schema object") |
ab03de8e503e
util.datamapper: Handle nested arrays or objects in arrays
Kim Alvefur <zash@zash.se>
parents:
11470
diff
changeset
|
181 end |
ab03de8e503e
util.datamapper: Handle nested arrays or objects in arrays
Kim Alvefur <zash@zash.se>
parents:
11470
diff
changeset
|
182 elseif proptype == "array" then |
ab03de8e503e
util.datamapper: Handle nested arrays or objects in arrays
Kim Alvefur <zash@zash.se>
parents:
11470
diff
changeset
|
183 if type(itemschema) == "table" then |
ab03de8e503e
util.datamapper: Handle nested arrays or objects in arrays
Kim Alvefur <zash@zash.se>
parents:
11470
diff
changeset
|
184 for c in s:childtags(child_name, namespace) do |
ab03de8e503e
util.datamapper: Handle nested arrays or objects in arrays
Kim Alvefur <zash@zash.se>
parents:
11470
diff
changeset
|
185 table.insert(out, parse_array(itemschema, c)); |
ab03de8e503e
util.datamapper: Handle nested arrays or objects in arrays
Kim Alvefur <zash@zash.se>
parents:
11470
diff
changeset
|
186 end |
ab03de8e503e
util.datamapper: Handle nested arrays or objects in arrays
Kim Alvefur <zash@zash.se>
parents:
11470
diff
changeset
|
187 end |
ab03de8e503e
util.datamapper: Handle nested arrays or objects in arrays
Kim Alvefur <zash@zash.se>
parents:
11470
diff
changeset
|
188 else |
ab03de8e503e
util.datamapper: Handle nested arrays or objects in arrays
Kim Alvefur <zash@zash.se>
parents:
11470
diff
changeset
|
189 for c in s:childtags(child_name, namespace) do |
ab03de8e503e
util.datamapper: Handle nested arrays or objects in arrays
Kim Alvefur <zash@zash.se>
parents:
11470
diff
changeset
|
190 local value = extract_value(c, value_where, proptype, attr_name or child_name, namespace, prefix, single_attribute, enums) |
ab03de8e503e
util.datamapper: Handle nested arrays or objects in arrays
Kim Alvefur <zash@zash.se>
parents:
11470
diff
changeset
|
191 |
ab03de8e503e
util.datamapper: Handle nested arrays or objects in arrays
Kim Alvefur <zash@zash.se>
parents:
11470
diff
changeset
|
192 table.insert(out, totype(proptype, value)); |
ab03de8e503e
util.datamapper: Handle nested arrays or objects in arrays
Kim Alvefur <zash@zash.se>
parents:
11470
diff
changeset
|
193 end |
11457
6a51749af7f4
util.datamapper: Add initial support for parsing arrays
Kim Alvefur <zash@zash.se>
parents:
11456
diff
changeset
|
194 end |
6a51749af7f4
util.datamapper: Add initial support for parsing arrays
Kim Alvefur <zash@zash.se>
parents:
11456
diff
changeset
|
195 return out |
6a51749af7f4
util.datamapper: Add initial support for parsing arrays
Kim Alvefur <zash@zash.se>
parents:
11456
diff
changeset
|
196 end |
6a51749af7f4
util.datamapper: Add initial support for parsing arrays
Kim Alvefur <zash@zash.se>
parents:
11456
diff
changeset
|
197 |
11435
a1fa6202fa13
util.datamapper: Library for extracting data from stanzas
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
198 local function parse(schema, s) |
a1fa6202fa13
util.datamapper: Library for extracting data from stanzas
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
199 if schema.type == "object" then |
a1fa6202fa13
util.datamapper: Library for extracting data from stanzas
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
200 return parse_object(schema, s) |
11457
6a51749af7f4
util.datamapper: Add initial support for parsing arrays
Kim Alvefur <zash@zash.se>
parents:
11456
diff
changeset
|
201 elseif schema.type == "array" then |
6a51749af7f4
util.datamapper: Add initial support for parsing arrays
Kim Alvefur <zash@zash.se>
parents:
11456
diff
changeset
|
202 return parse_array(schema, s) |
6a51749af7f4
util.datamapper: Add initial support for parsing arrays
Kim Alvefur <zash@zash.se>
parents:
11456
diff
changeset
|
203 else |
6a51749af7f4
util.datamapper: Add initial support for parsing arrays
Kim Alvefur <zash@zash.se>
parents:
11456
diff
changeset
|
204 error("top-level scalars unsupported") |
11435
a1fa6202fa13
util.datamapper: Library for extracting data from stanzas
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
205 end |
a1fa6202fa13
util.datamapper: Library for extracting data from stanzas
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
206 end |
a1fa6202fa13
util.datamapper: Library for extracting data from stanzas
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
207 |
11475
9bd36e871f05
util.datamapper: Factor out conversion from any value to XML string
Kim Alvefur <zash@zash.se>
parents:
11471
diff
changeset
|
208 local function toxmlstring(proptype, v) |
9bd36e871f05
util.datamapper: Factor out conversion from any value to XML string
Kim Alvefur <zash@zash.se>
parents:
11471
diff
changeset
|
209 if proptype == "string" and type(v) == "string" then |
9bd36e871f05
util.datamapper: Factor out conversion from any value to XML string
Kim Alvefur <zash@zash.se>
parents:
11471
diff
changeset
|
210 return v |
9bd36e871f05
util.datamapper: Factor out conversion from any value to XML string
Kim Alvefur <zash@zash.se>
parents:
11471
diff
changeset
|
211 elseif proptype == "number" and type(v) == "number" then |
9bd36e871f05
util.datamapper: Factor out conversion from any value to XML string
Kim Alvefur <zash@zash.se>
parents:
11471
diff
changeset
|
212 return string.format("%g", v) |
9bd36e871f05
util.datamapper: Factor out conversion from any value to XML string
Kim Alvefur <zash@zash.se>
parents:
11471
diff
changeset
|
213 elseif proptype == "integer" and type(v) == "number" then |
9bd36e871f05
util.datamapper: Factor out conversion from any value to XML string
Kim Alvefur <zash@zash.se>
parents:
11471
diff
changeset
|
214 return string.format("%d", v) |
9bd36e871f05
util.datamapper: Factor out conversion from any value to XML string
Kim Alvefur <zash@zash.se>
parents:
11471
diff
changeset
|
215 elseif proptype == "boolean" then |
9bd36e871f05
util.datamapper: Factor out conversion from any value to XML string
Kim Alvefur <zash@zash.se>
parents:
11471
diff
changeset
|
216 return v and "1" or "0" |
9bd36e871f05
util.datamapper: Factor out conversion from any value to XML string
Kim Alvefur <zash@zash.se>
parents:
11471
diff
changeset
|
217 end |
9bd36e871f05
util.datamapper: Factor out conversion from any value to XML string
Kim Alvefur <zash@zash.se>
parents:
11471
diff
changeset
|
218 end |
9bd36e871f05
util.datamapper: Factor out conversion from any value to XML string
Kim Alvefur <zash@zash.se>
parents:
11471
diff
changeset
|
219 |
11467
88792dd2bee9
util.datamapper: Factor out handling of object properties for array reuse
Kim Alvefur <zash@zash.se>
parents:
11466
diff
changeset
|
220 local unparse |
88792dd2bee9
util.datamapper: Factor out handling of object properties for array reuse
Kim Alvefur <zash@zash.se>
parents:
11466
diff
changeset
|
221 |
88792dd2bee9
util.datamapper: Factor out handling of object properties for array reuse
Kim Alvefur <zash@zash.se>
parents:
11466
diff
changeset
|
222 local function unparse_property(out, v, proptype, propschema, value_where, name, namespace, current_ns, prefix, single_attribute) |
88792dd2bee9
util.datamapper: Factor out handling of object properties for array reuse
Kim Alvefur <zash@zash.se>
parents:
11466
diff
changeset
|
223 if value_where == "in_attribute" then |
88792dd2bee9
util.datamapper: Factor out handling of object properties for array reuse
Kim Alvefur <zash@zash.se>
parents:
11466
diff
changeset
|
224 local attr = name |
88792dd2bee9
util.datamapper: Factor out handling of object properties for array reuse
Kim Alvefur <zash@zash.se>
parents:
11466
diff
changeset
|
225 if prefix then |
88792dd2bee9
util.datamapper: Factor out handling of object properties for array reuse
Kim Alvefur <zash@zash.se>
parents:
11466
diff
changeset
|
226 attr = prefix .. ":" .. name |
11476
83e127eb91f9
util.datamapper: Deal with locally built stanzas missing xmlns
Kim Alvefur <zash@zash.se>
parents:
11475
diff
changeset
|
227 elseif namespace and namespace ~= current_ns then |
11467
88792dd2bee9
util.datamapper: Factor out handling of object properties for array reuse
Kim Alvefur <zash@zash.se>
parents:
11466
diff
changeset
|
228 attr = namespace .. "\1" .. name |
88792dd2bee9
util.datamapper: Factor out handling of object properties for array reuse
Kim Alvefur <zash@zash.se>
parents:
11466
diff
changeset
|
229 end |
88792dd2bee9
util.datamapper: Factor out handling of object properties for array reuse
Kim Alvefur <zash@zash.se>
parents:
11466
diff
changeset
|
230 |
11475
9bd36e871f05
util.datamapper: Factor out conversion from any value to XML string
Kim Alvefur <zash@zash.se>
parents:
11471
diff
changeset
|
231 out.attr[attr] = toxmlstring(proptype, v) |
11467
88792dd2bee9
util.datamapper: Factor out handling of object properties for array reuse
Kim Alvefur <zash@zash.se>
parents:
11466
diff
changeset
|
232 elseif value_where == "in_text" then |
11475
9bd36e871f05
util.datamapper: Factor out conversion from any value to XML string
Kim Alvefur <zash@zash.se>
parents:
11471
diff
changeset
|
233 out:text(toxmlstring(proptype, v)) |
11467
88792dd2bee9
util.datamapper: Factor out handling of object properties for array reuse
Kim Alvefur <zash@zash.se>
parents:
11466
diff
changeset
|
234 elseif value_where == "in_single_attribute" then |
88792dd2bee9
util.datamapper: Factor out handling of object properties for array reuse
Kim Alvefur <zash@zash.se>
parents:
11466
diff
changeset
|
235 assert(single_attribute) |
88792dd2bee9
util.datamapper: Factor out handling of object properties for array reuse
Kim Alvefur <zash@zash.se>
parents:
11466
diff
changeset
|
236 local propattr = {} |
88792dd2bee9
util.datamapper: Factor out handling of object properties for array reuse
Kim Alvefur <zash@zash.se>
parents:
11466
diff
changeset
|
237 |
11476
83e127eb91f9
util.datamapper: Deal with locally built stanzas missing xmlns
Kim Alvefur <zash@zash.se>
parents:
11475
diff
changeset
|
238 if namespace and namespace ~= current_ns then |
11467
88792dd2bee9
util.datamapper: Factor out handling of object properties for array reuse
Kim Alvefur <zash@zash.se>
parents:
11466
diff
changeset
|
239 propattr.xmlns = namespace |
88792dd2bee9
util.datamapper: Factor out handling of object properties for array reuse
Kim Alvefur <zash@zash.se>
parents:
11466
diff
changeset
|
240 end |
88792dd2bee9
util.datamapper: Factor out handling of object properties for array reuse
Kim Alvefur <zash@zash.se>
parents:
11466
diff
changeset
|
241 |
11475
9bd36e871f05
util.datamapper: Factor out conversion from any value to XML string
Kim Alvefur <zash@zash.se>
parents:
11471
diff
changeset
|
242 propattr[single_attribute] = toxmlstring(proptype, v) |
11467
88792dd2bee9
util.datamapper: Factor out handling of object properties for array reuse
Kim Alvefur <zash@zash.se>
parents:
11466
diff
changeset
|
243 out:tag(name, propattr):up(); |
88792dd2bee9
util.datamapper: Factor out handling of object properties for array reuse
Kim Alvefur <zash@zash.se>
parents:
11466
diff
changeset
|
244 |
88792dd2bee9
util.datamapper: Factor out handling of object properties for array reuse
Kim Alvefur <zash@zash.se>
parents:
11466
diff
changeset
|
245 else |
88792dd2bee9
util.datamapper: Factor out handling of object properties for array reuse
Kim Alvefur <zash@zash.se>
parents:
11466
diff
changeset
|
246 local propattr |
88792dd2bee9
util.datamapper: Factor out handling of object properties for array reuse
Kim Alvefur <zash@zash.se>
parents:
11466
diff
changeset
|
247 if namespace ~= current_ns then |
88792dd2bee9
util.datamapper: Factor out handling of object properties for array reuse
Kim Alvefur <zash@zash.se>
parents:
11466
diff
changeset
|
248 propattr = {xmlns = namespace} |
88792dd2bee9
util.datamapper: Factor out handling of object properties for array reuse
Kim Alvefur <zash@zash.se>
parents:
11466
diff
changeset
|
249 end |
88792dd2bee9
util.datamapper: Factor out handling of object properties for array reuse
Kim Alvefur <zash@zash.se>
parents:
11466
diff
changeset
|
250 if value_where == "in_tag_name" then |
88792dd2bee9
util.datamapper: Factor out handling of object properties for array reuse
Kim Alvefur <zash@zash.se>
parents:
11466
diff
changeset
|
251 if proptype == "string" and type(v) == "string" then |
88792dd2bee9
util.datamapper: Factor out handling of object properties for array reuse
Kim Alvefur <zash@zash.se>
parents:
11466
diff
changeset
|
252 out:tag(v, propattr):up(); |
88792dd2bee9
util.datamapper: Factor out handling of object properties for array reuse
Kim Alvefur <zash@zash.se>
parents:
11466
diff
changeset
|
253 elseif proptype == "boolean" and v == true then |
88792dd2bee9
util.datamapper: Factor out handling of object properties for array reuse
Kim Alvefur <zash@zash.se>
parents:
11466
diff
changeset
|
254 out:tag(name, propattr):up(); |
88792dd2bee9
util.datamapper: Factor out handling of object properties for array reuse
Kim Alvefur <zash@zash.se>
parents:
11466
diff
changeset
|
255 end |
88792dd2bee9
util.datamapper: Factor out handling of object properties for array reuse
Kim Alvefur <zash@zash.se>
parents:
11466
diff
changeset
|
256 elseif proptype == "object" and type(propschema) == "table" and type(v) == "table" then |
88792dd2bee9
util.datamapper: Factor out handling of object properties for array reuse
Kim Alvefur <zash@zash.se>
parents:
11466
diff
changeset
|
257 local c = unparse(propschema, v, name, namespace); |
88792dd2bee9
util.datamapper: Factor out handling of object properties for array reuse
Kim Alvefur <zash@zash.se>
parents:
11466
diff
changeset
|
258 if c then |
88792dd2bee9
util.datamapper: Factor out handling of object properties for array reuse
Kim Alvefur <zash@zash.se>
parents:
11466
diff
changeset
|
259 out:add_direct_child(c); |
88792dd2bee9
util.datamapper: Factor out handling of object properties for array reuse
Kim Alvefur <zash@zash.se>
parents:
11466
diff
changeset
|
260 end |
88792dd2bee9
util.datamapper: Factor out handling of object properties for array reuse
Kim Alvefur <zash@zash.se>
parents:
11466
diff
changeset
|
261 elseif proptype == "array" and type(propschema) == "table" and type(v) == "table" then |
88792dd2bee9
util.datamapper: Factor out handling of object properties for array reuse
Kim Alvefur <zash@zash.se>
parents:
11466
diff
changeset
|
262 if value_where == "in_wrapper" then |
88792dd2bee9
util.datamapper: Factor out handling of object properties for array reuse
Kim Alvefur <zash@zash.se>
parents:
11466
diff
changeset
|
263 local c = unparse(propschema, v, name, namespace); |
88792dd2bee9
util.datamapper: Factor out handling of object properties for array reuse
Kim Alvefur <zash@zash.se>
parents:
11466
diff
changeset
|
264 if c then |
88792dd2bee9
util.datamapper: Factor out handling of object properties for array reuse
Kim Alvefur <zash@zash.se>
parents:
11466
diff
changeset
|
265 out:add_direct_child(c); |
88792dd2bee9
util.datamapper: Factor out handling of object properties for array reuse
Kim Alvefur <zash@zash.se>
parents:
11466
diff
changeset
|
266 end |
88792dd2bee9
util.datamapper: Factor out handling of object properties for array reuse
Kim Alvefur <zash@zash.se>
parents:
11466
diff
changeset
|
267 else |
88792dd2bee9
util.datamapper: Factor out handling of object properties for array reuse
Kim Alvefur <zash@zash.se>
parents:
11466
diff
changeset
|
268 unparse(propschema, v, name, namespace, out); |
88792dd2bee9
util.datamapper: Factor out handling of object properties for array reuse
Kim Alvefur <zash@zash.se>
parents:
11466
diff
changeset
|
269 end |
11475
9bd36e871f05
util.datamapper: Factor out conversion from any value to XML string
Kim Alvefur <zash@zash.se>
parents:
11471
diff
changeset
|
270 else |
9bd36e871f05
util.datamapper: Factor out conversion from any value to XML string
Kim Alvefur <zash@zash.se>
parents:
11471
diff
changeset
|
271 out:text_tag(name, toxmlstring(proptype, v), propattr) |
11467
88792dd2bee9
util.datamapper: Factor out handling of object properties for array reuse
Kim Alvefur <zash@zash.se>
parents:
11466
diff
changeset
|
272 end |
88792dd2bee9
util.datamapper: Factor out handling of object properties for array reuse
Kim Alvefur <zash@zash.se>
parents:
11466
diff
changeset
|
273 end |
88792dd2bee9
util.datamapper: Factor out handling of object properties for array reuse
Kim Alvefur <zash@zash.se>
parents:
11466
diff
changeset
|
274 end |
88792dd2bee9
util.datamapper: Factor out handling of object properties for array reuse
Kim Alvefur <zash@zash.se>
parents:
11466
diff
changeset
|
275 |
88792dd2bee9
util.datamapper: Factor out handling of object properties for array reuse
Kim Alvefur <zash@zash.se>
parents:
11466
diff
changeset
|
276 function unparse(schema, t, current_name, current_ns, ctx) |
11436
5df9ffc25bb4
util.datamapper: Add 'unparse' for turning tables into XML
Kim Alvefur <zash@zash.se>
parents:
11435
diff
changeset
|
277 |
11458
0e00fa518688
util.datamapper: Limited support for unparsing simple arrays of strings
Kim Alvefur <zash@zash.se>
parents:
11457
diff
changeset
|
278 if schema.xml then |
0e00fa518688
util.datamapper: Limited support for unparsing simple arrays of strings
Kim Alvefur <zash@zash.se>
parents:
11457
diff
changeset
|
279 if schema.xml.name then |
0e00fa518688
util.datamapper: Limited support for unparsing simple arrays of strings
Kim Alvefur <zash@zash.se>
parents:
11457
diff
changeset
|
280 current_name = schema.xml.name |
0e00fa518688
util.datamapper: Limited support for unparsing simple arrays of strings
Kim Alvefur <zash@zash.se>
parents:
11457
diff
changeset
|
281 end |
0e00fa518688
util.datamapper: Limited support for unparsing simple arrays of strings
Kim Alvefur <zash@zash.se>
parents:
11457
diff
changeset
|
282 if schema.xml.namespace then |
0e00fa518688
util.datamapper: Limited support for unparsing simple arrays of strings
Kim Alvefur <zash@zash.se>
parents:
11457
diff
changeset
|
283 current_ns = schema.xml.namespace |
11436
5df9ffc25bb4
util.datamapper: Add 'unparse' for turning tables into XML
Kim Alvefur <zash@zash.se>
parents:
11435
diff
changeset
|
284 end |
5df9ffc25bb4
util.datamapper: Add 'unparse' for turning tables into XML
Kim Alvefur <zash@zash.se>
parents:
11435
diff
changeset
|
285 |
11458
0e00fa518688
util.datamapper: Limited support for unparsing simple arrays of strings
Kim Alvefur <zash@zash.se>
parents:
11457
diff
changeset
|
286 end |
0e00fa518688
util.datamapper: Limited support for unparsing simple arrays of strings
Kim Alvefur <zash@zash.se>
parents:
11457
diff
changeset
|
287 |
11462
d1982b7eb00d
util.datamapper: Fix arrays nesting one level too deep
Kim Alvefur <zash@zash.se>
parents:
11461
diff
changeset
|
288 local out = ctx or st.stanza(current_name, {xmlns = current_ns}) |
11458
0e00fa518688
util.datamapper: Limited support for unparsing simple arrays of strings
Kim Alvefur <zash@zash.se>
parents:
11457
diff
changeset
|
289 |
0e00fa518688
util.datamapper: Limited support for unparsing simple arrays of strings
Kim Alvefur <zash@zash.se>
parents:
11457
diff
changeset
|
290 if schema.type == "object" then |
11436
5df9ffc25bb4
util.datamapper: Add 'unparse' for turning tables into XML
Kim Alvefur <zash@zash.se>
parents:
11435
diff
changeset
|
291 |
5df9ffc25bb4
util.datamapper: Add 'unparse' for turning tables into XML
Kim Alvefur <zash@zash.se>
parents:
11435
diff
changeset
|
292 for prop, propschema in pairs(schema.properties) do |
5df9ffc25bb4
util.datamapper: Add 'unparse' for turning tables into XML
Kim Alvefur <zash@zash.se>
parents:
11435
diff
changeset
|
293 local v = t[prop] |
5df9ffc25bb4
util.datamapper: Add 'unparse' for turning tables into XML
Kim Alvefur <zash@zash.se>
parents:
11435
diff
changeset
|
294 |
5df9ffc25bb4
util.datamapper: Add 'unparse' for turning tables into XML
Kim Alvefur <zash@zash.se>
parents:
11435
diff
changeset
|
295 if v ~= nil then |
11456
4e376a43fe40
util.datamapper: Factor out common schema unpacking
Kim Alvefur <zash@zash.se>
parents:
11455
diff
changeset
|
296 local proptype, value_where, name, namespace, prefix, single_attribute = unpack_propschema(propschema, prop, current_ns) |
11467
88792dd2bee9
util.datamapper: Factor out handling of object properties for array reuse
Kim Alvefur <zash@zash.se>
parents:
11466
diff
changeset
|
297 unparse_property(out, v, proptype, propschema, value_where, name, namespace, current_ns, prefix, single_attribute) |
11436
5df9ffc25bb4
util.datamapper: Add 'unparse' for turning tables into XML
Kim Alvefur <zash@zash.se>
parents:
11435
diff
changeset
|
298 end |
5df9ffc25bb4
util.datamapper: Add 'unparse' for turning tables into XML
Kim Alvefur <zash@zash.se>
parents:
11435
diff
changeset
|
299 end |
5df9ffc25bb4
util.datamapper: Add 'unparse' for turning tables into XML
Kim Alvefur <zash@zash.se>
parents:
11435
diff
changeset
|
300 return out |
5df9ffc25bb4
util.datamapper: Add 'unparse' for turning tables into XML
Kim Alvefur <zash@zash.se>
parents:
11435
diff
changeset
|
301 |
11458
0e00fa518688
util.datamapper: Limited support for unparsing simple arrays of strings
Kim Alvefur <zash@zash.se>
parents:
11457
diff
changeset
|
302 elseif schema.type == "array" then |
11468
348b191cd850
util.datamapper: Complete array building support
Kim Alvefur <zash@zash.se>
parents:
11467
diff
changeset
|
303 local proptype, value_where, name, namespace, prefix, single_attribute = unpack_propschema(schema.items, current_name, current_ns) |
348b191cd850
util.datamapper: Complete array building support
Kim Alvefur <zash@zash.se>
parents:
11467
diff
changeset
|
304 for _, item in ipairs(t) do |
348b191cd850
util.datamapper: Complete array building support
Kim Alvefur <zash@zash.se>
parents:
11467
diff
changeset
|
305 unparse_property(out, item, proptype, schema.items, value_where, name, namespace, current_ns, prefix, single_attribute) |
11458
0e00fa518688
util.datamapper: Limited support for unparsing simple arrays of strings
Kim Alvefur <zash@zash.se>
parents:
11457
diff
changeset
|
306 end |
0e00fa518688
util.datamapper: Limited support for unparsing simple arrays of strings
Kim Alvefur <zash@zash.se>
parents:
11457
diff
changeset
|
307 return out |
11436
5df9ffc25bb4
util.datamapper: Add 'unparse' for turning tables into XML
Kim Alvefur <zash@zash.se>
parents:
11435
diff
changeset
|
308 end |
5df9ffc25bb4
util.datamapper: Add 'unparse' for turning tables into XML
Kim Alvefur <zash@zash.se>
parents:
11435
diff
changeset
|
309 end |
5df9ffc25bb4
util.datamapper: Add 'unparse' for turning tables into XML
Kim Alvefur <zash@zash.se>
parents:
11435
diff
changeset
|
310 |
5df9ffc25bb4
util.datamapper: Add 'unparse' for turning tables into XML
Kim Alvefur <zash@zash.se>
parents:
11435
diff
changeset
|
311 return {parse = parse; unparse = unparse} |