scansion/objects/client.lua

changeset 37
b2036129ccd0
parent 34
946c7d13faac
child 38
68458d0c50a0
equal deleted inserted replaced
36:b1d7a274d250 37:b2036129ccd0
5 5
6 local stanza_timeout = 5; 6 local stanza_timeout = 5;
7 7
8 local stanzacmp = require "scansion.stanzacmp"; 8 local stanzacmp = require "scansion.stanzacmp";
9 9
10 local function filter_expression(script, s)
11 local expr = s:match("^%$%{(.+)%}$");
12 if not expr then return s end
13 local name, value_name = expr:match("^(.-)'s (.+)$");
14 assert(name, "Unable to parse expression: "..expr);
15 local key = value_name:lower():gsub(" ", "_");
16 assert(script.objects[name], "Unknown object called "..name);
17 local value = script.objects[name][key];
18 assert(value ~= nil, "Unknown attribute (of "..name.."): "..value_name);
19 return value;
20 end
21
10 local function fill_vars(script, stanza) 22 local function fill_vars(script, stanza)
11 for k, v in pairs(stanza.attr) do 23 for k, v in pairs(stanza.attr) do
12 local expr = v:match("^%$%{(.+)%}$"); 24 stanza.attr[k] = filter_expression(script, v);
13 if expr then
14 local name, value_name = expr:match("^(.-)'s (.+)$");
15 assert(name, "Unable to parse expression: "..expr);
16 local key = value_name:lower():gsub(" ", "_");
17 assert(script.objects[name], "Unknown object called "..name);
18 local value = script.objects[name][key];
19 assert(value ~= nil, "Unknown attribute (of "..name.."): "..value_name);
20 stanza.attr[k] = value;
21 end
22 end 25 end
23 for _, child in ipairs(stanza.tags) do 26 for _, child in ipairs(stanza.tags) do
24 fill_vars(script, child); 27 fill_vars(script, child);
25 end 28 end
26 return stanza; 29 return stanza;

mercurial