Comparison

util/datamapper.lua @ 11456:4e376a43fe40

util.datamapper: Factor out common schema unpacking This code extracts the bits from the schema that determines how the data is to be mapped to/from XML.
author Kim Alvefur <zash@zash.se>
date Sun, 14 Mar 2021 16:50:49 +0100
parent 11455:a5050e21ab08
child 11457:6a51749af7f4
comparison
equal deleted inserted replaced
11455:a5050e21ab08 11456:4e376a43fe40
20 end 20 end
21 end 21 end
22 22
23 local value_goes = {} 23 local value_goes = {}
24 24
25 local function unpack_propschema(propschema, propname, current_ns)
26
27 local proptype = "string"
28 local value_where = "in_text_tag"
29 local name = propname
30 local namespace = current_ns
31 local prefix
32 local single_attribute
33 local enums
34
35 if type(propschema) == "table" then
36 proptype = propschema.type
37 elseif type(propschema) == "string" then
38 proptype = propschema
39 end
40
41 if type(propschema) == "table" then
42 local xml = propschema.xml
43 if xml then
44 if xml.name then
45 name = xml.name
46 end
47 if xml.namespace then
48 namespace = xml.namespace
49 end
50 if xml.prefix then
51 prefix = xml.prefix
52 end
53
54 if xml.attribute then
55 value_where = "in_attribute"
56 elseif xml.text then
57 value_where = "in_text"
58 elseif xml.x_name_is_value then
59 value_where = "in_tag_name"
60 elseif xml.x_single_attribute then
61 single_attribute = xml.x_single_attribute
62 value_where = "in_single_attribute"
63 end
64 end
65 if propschema["const"] then
66 enums = {propschema["const"]}
67 elseif propschema["enum"] then
68 enums = propschema["enum"]
69 end
70 end
71
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 end
78
25 local function parse_object(schema, s) 79 local function parse_object(schema, s)
26 local out = {} 80 local out = {}
27 if schema.properties then 81 if schema.properties then
28 for prop, propschema in pairs(schema.properties) do 82 for prop, propschema in pairs(schema.properties) do
29 83
30 local name = prop 84 local proptype, value_where, name, namespace, prefix, single_attribute, enums = unpack_propschema(propschema, prop, s.attr.xmlns)
31 local namespace = s.attr.xmlns;
32 local prefix = nil
33 local value_where = "in_text_tag"
34 local single_attribute
35 local enums
36
37 local proptype
38 if type(propschema) == "table" then
39 proptype = propschema.type
40 elseif type(propschema) == "string" then
41 proptype = propschema
42 end
43
44 if proptype == "object" or proptype == "array" then
45 value_where = "in_children"
46 end
47
48 if type(propschema) == "table" and propschema.xml then
49 if propschema.xml.name then
50 name = propschema.xml.name
51 end
52 if propschema.xml.namespace then
53 namespace = propschema.xml.namespace
54 end
55 if propschema.xml.prefix then
56 prefix = propschema.xml.prefix
57 end
58 if propschema.xml.attribute then
59 value_where = "in_attribute"
60 elseif propschema.xml.text then
61
62 value_where = "in_text"
63 elseif propschema.xml.x_name_is_value then
64
65 value_where = "in_tag_name"
66 elseif propschema.xml.x_single_attribute then
67
68 single_attribute = propschema.xml.x_single_attribute
69 value_where = "in_single_attribute"
70 end
71 if propschema["const"] then
72 enums = {propschema["const"]}
73 elseif propschema["enum"] then
74 enums = propschema["enum"]
75 end
76 end
77 85
78 local value 86 local value
79 if value_where == "in_tag_name" then 87 if value_where == "in_tag_name" then
80 local c 88 local c
81 if proptype == "boolean" then 89 if proptype == "boolean" then
150 158
151 for prop, propschema in pairs(schema.properties) do 159 for prop, propschema in pairs(schema.properties) do
152 local v = t[prop] 160 local v = t[prop]
153 161
154 if v ~= nil then 162 if v ~= nil then
155 local proptype 163
156 if type(propschema) == "table" then 164 local proptype, value_where, name, namespace, prefix, single_attribute = unpack_propschema(propschema, prop, current_ns)
157 proptype = propschema.type
158 elseif type(propschema) == "string" then
159 proptype = propschema
160 end
161
162 local name = prop
163 local namespace = current_ns
164 local prefix = nil
165 local value_where = "in_text_tag"
166 local single_attribute
167
168 if type(propschema) == "table" and propschema.xml then
169
170 if propschema.xml.name then
171 name = propschema.xml.name
172 end
173 if propschema.xml.namespace then
174 namespace = propschema.xml.namespace
175 end
176
177 if propschema.xml.prefix then
178 prefix = propschema.xml.prefix
179 end
180
181 if propschema.xml.attribute then
182 value_where = "in_attribute"
183 elseif propschema.xml.text then
184 value_where = "in_text"
185 elseif propschema.xml.x_name_is_value then
186 value_where = "in_tag_name"
187 elseif propschema.xml.x_single_attribute then
188 single_attribute = propschema.xml.x_single_attribute
189 value_where = "in_single_attribute"
190 end
191 end
192 165
193 if value_where == "in_attribute" then 166 if value_where == "in_attribute" then
194 local attr = name 167 local attr = name
195 if prefix then 168 if prefix then
196 attr = prefix .. ":" .. name 169 attr = prefix .. ":" .. name