Mercurial > prosody-hg
comparison util/datamapper.lua @ 11454:1d9c1893cc5e
util.datamapper: Use enum instead of mutually exclusive booleans
Cleaner and rules out invalid combinations.
| author | Kim Alvefur <zash@zash.se> |
|---|---|
| date | Sun, 14 Mar 2021 01:57:00 +0100 |
| parents | f0037234b2e9 |
| children | a5050e21ab08 |
comparison
equal
deleted
inserted
replaced
| 11453:f0037234b2e9 | 11454:1d9c1893cc5e |
|---|---|
| 6 elseif s == "false" or s == "0" then | 6 elseif s == "false" or s == "0" then |
| 7 return false | 7 return false |
| 8 end | 8 end |
| 9 end | 9 end |
| 10 | 10 |
| 11 local value_goes = {} | |
| 12 | |
| 11 local function parse_object(schema, s) | 13 local function parse_object(schema, s) |
| 12 local out = {} | 14 local out = {} |
| 13 if schema.properties then | 15 if schema.properties then |
| 14 for prop, propschema in pairs(schema.properties) do | 16 for prop, propschema in pairs(schema.properties) do |
| 15 | 17 |
| 16 local name = prop | 18 local name = prop |
| 17 local namespace = s.attr.xmlns; | 19 local namespace = s.attr.xmlns; |
| 18 local prefix = nil | 20 local prefix = nil |
| 19 local is_attribute = false | 21 local value_where = "in_text_tag" |
| 20 local is_text = false | |
| 21 local name_is_value = false; | |
| 22 local single_attribute | 22 local single_attribute |
| 23 local enums | 23 local enums |
| 24 | 24 |
| 25 local proptype | 25 local proptype |
| 26 if type(propschema) == "table" then | 26 if type(propschema) == "table" then |
| 38 end | 38 end |
| 39 if propschema.xml.prefix then | 39 if propschema.xml.prefix then |
| 40 prefix = propschema.xml.prefix | 40 prefix = propschema.xml.prefix |
| 41 end | 41 end |
| 42 if propschema.xml.attribute then | 42 if propschema.xml.attribute then |
| 43 is_attribute = true | 43 value_where = "in_attribute" |
| 44 elseif propschema.xml.text then | 44 elseif propschema.xml.text then |
| 45 | 45 |
| 46 is_text = true | 46 value_where = "in_text" |
| 47 elseif propschema.xml.x_name_is_value then | 47 elseif propschema.xml.x_name_is_value then |
| 48 | 48 |
| 49 name_is_value = true | 49 value_where = "in_tag_name" |
| 50 elseif propschema.xml.x_single_attribute then | 50 elseif propschema.xml.x_single_attribute then |
| 51 | 51 |
| 52 single_attribute = propschema.xml.x_single_attribute | 52 single_attribute = propschema.xml.x_single_attribute |
| 53 value_where = "in_single_attribute" | |
| 53 end | 54 end |
| 54 if propschema["const"] then | 55 if propschema["const"] then |
| 55 enums = {propschema["const"]} | 56 enums = {propschema["const"]} |
| 56 elseif propschema["enum"] then | 57 elseif propschema["enum"] then |
| 57 enums = propschema["enum"] | 58 enums = propschema["enum"] |
| 58 end | 59 end |
| 59 end | 60 end |
| 60 | 61 |
| 61 if name_is_value then | 62 if value_where == "in_tag_name" then |
| 62 local c | 63 local c |
| 63 if proptype == "boolean" then | 64 if proptype == "boolean" then |
| 64 c = s:get_child(name, namespace); | 65 c = s:get_child(name, namespace); |
| 65 elseif enums and proptype == "string" then | 66 elseif enums and proptype == "string" then |
| 66 | 67 |
| 76 if c and proptype == "string" then | 77 if c and proptype == "string" then |
| 77 out[prop] = c.name; | 78 out[prop] = c.name; |
| 78 elseif proptype == "boolean" and c then | 79 elseif proptype == "boolean" and c then |
| 79 out[prop] = true; | 80 out[prop] = true; |
| 80 end | 81 end |
| 81 elseif is_attribute then | 82 elseif value_where == "in_attribute" then |
| 82 local attr = name | 83 local attr = name |
| 83 if prefix then | 84 if prefix then |
| 84 attr = prefix .. ":" .. name | 85 attr = prefix .. ":" .. name |
| 85 elseif namespace ~= s.attr.xmlns then | 86 elseif namespace ~= s.attr.xmlns then |
| 86 attr = namespace .. "\1" .. name | 87 attr = namespace .. "\1" .. name |
| 93 elseif proptype == "boolean" then | 94 elseif proptype == "boolean" then |
| 94 out[prop] = toboolean(s.attr[attr]) | 95 out[prop] = toboolean(s.attr[attr]) |
| 95 | 96 |
| 96 end | 97 end |
| 97 | 98 |
| 98 elseif is_text then | 99 elseif value_where == "in_text" then |
| 99 if proptype == "string" then | 100 if proptype == "string" then |
| 100 out[prop] = s:get_text() | 101 out[prop] = s:get_text() |
| 101 elseif proptype == "integer" or proptype == "number" then | 102 elseif proptype == "integer" or proptype == "number" then |
| 102 out[prop] = tonumber(s:get_text()) | 103 out[prop] = tonumber(s:get_text()) |
| 103 end | 104 end |
| 104 | 105 |
| 105 elseif single_attribute then | 106 elseif value_where == "in_single_attribute" then |
| 106 local c = s:get_child(name, namespace) | 107 local c = s:get_child(name, namespace) |
| 107 local a = c and c.attr[single_attribute] | 108 local a = c and c.attr[single_attribute] |
| 108 if proptype == "string" then | 109 if proptype == "string" then |
| 109 out[prop] = a | 110 out[prop] = a |
| 110 elseif proptype == "integer" or proptype == "number" then | 111 elseif proptype == "integer" or proptype == "number" then |
| 165 end | 166 end |
| 166 | 167 |
| 167 local name = prop | 168 local name = prop |
| 168 local namespace = current_ns | 169 local namespace = current_ns |
| 169 local prefix = nil | 170 local prefix = nil |
| 170 local is_attribute = false | 171 local value_where = "in_text_tag" |
| 171 local is_text = false | |
| 172 local name_is_value = false; | |
| 173 local single_attribute | 172 local single_attribute |
| 174 | 173 |
| 175 if type(propschema) == "table" and propschema.xml then | 174 if type(propschema) == "table" and propschema.xml then |
| 176 | 175 |
| 177 if propschema.xml.name then | 176 if propschema.xml.name then |
| 184 if propschema.xml.prefix then | 183 if propschema.xml.prefix then |
| 185 prefix = propschema.xml.prefix | 184 prefix = propschema.xml.prefix |
| 186 end | 185 end |
| 187 | 186 |
| 188 if propschema.xml.attribute then | 187 if propschema.xml.attribute then |
| 189 is_attribute = true | 188 value_where = "in_attribute" |
| 190 elseif propschema.xml.text then | 189 elseif propschema.xml.text then |
| 191 is_text = true | 190 value_where = "in_text" |
| 192 elseif propschema.xml.x_name_is_value then | 191 elseif propschema.xml.x_name_is_value then |
| 193 name_is_value = true | 192 value_where = "in_tag_name" |
| 194 elseif propschema.xml.x_single_attribute then | 193 elseif propschema.xml.x_single_attribute then |
| 195 single_attribute = propschema.xml.x_single_attribute | 194 single_attribute = propschema.xml.x_single_attribute |
| 196 end | 195 value_where = "in_single_attribute" |
| 197 end | 196 end |
| 198 | 197 end |
| 199 if is_attribute then | 198 |
| 199 if value_where == "in_attribute" then | |
| 200 local attr = name | 200 local attr = name |
| 201 if prefix then | 201 if prefix then |
| 202 attr = prefix .. ":" .. name | 202 attr = prefix .. ":" .. name |
| 203 elseif namespace ~= current_ns then | 203 elseif namespace ~= current_ns then |
| 204 attr = namespace .. "\1" .. name | 204 attr = namespace .. "\1" .. name |
| 211 elseif proptype == "integer" and type(v) == "number" then | 211 elseif proptype == "integer" and type(v) == "number" then |
| 212 out.attr[attr] = string.format("%d", v) | 212 out.attr[attr] = string.format("%d", v) |
| 213 elseif proptype == "boolean" then | 213 elseif proptype == "boolean" then |
| 214 out.attr[attr] = v and "1" or "0" | 214 out.attr[attr] = v and "1" or "0" |
| 215 end | 215 end |
| 216 elseif is_text then | 216 elseif value_where == "in_text" then |
| 217 if type(v) == "string" then | 217 if type(v) == "string" then |
| 218 out:text(v) | 218 out:text(v) |
| 219 end | 219 end |
| 220 elseif single_attribute then | 220 elseif value_where == "in_single_attribute" then |
| 221 local propattr = {} | 221 local propattr = {} |
| 222 | 222 |
| 223 if namespace ~= current_ns then | 223 if namespace ~= current_ns then |
| 224 propattr.xmlns = namespace | 224 propattr.xmlns = namespace |
| 225 end | 225 end |
| 238 else | 238 else |
| 239 local propattr | 239 local propattr |
| 240 if namespace ~= current_ns then | 240 if namespace ~= current_ns then |
| 241 propattr = {xmlns = namespace} | 241 propattr = {xmlns = namespace} |
| 242 end | 242 end |
| 243 if name_is_value then | 243 if value_where == "in_tag_name" then |
| 244 if proptype == "string" and type(v) == "string" then | 244 if proptype == "string" and type(v) == "string" then |
| 245 out:tag(v, propattr):up(); | 245 out:tag(v, propattr):up(); |
| 246 elseif proptype == "boolean" and v == true then | 246 elseif proptype == "boolean" and v == true then |
| 247 out:tag(name, propattr):up(); | 247 out:tag(name, propattr):up(); |
| 248 end | 248 end |
