1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
|
local error_mt = { __name = "error" };
function error_mt:__tostring()
return ("error<%s:%s:%s>"):format(self.type, self.condition, self.text);
end
local function is_err(e)
return getmetatable(e) == error_mt;
end
local function new(e, context, registry)
local template = (registry and registry[e]) or e or {};
return setmetatable({
type = template.type or "cancel";
condition = template.condition or "undefined-condition";
text = template.text;
context = context or template.context or { _error_id = e };
}, error_mt);
end
local function coerce(ok, err, ...)
if ok or is_err(err) then
return ok, err, ...;
end
local new_err = setmetatable({
native = err;
type = "cancel";
condition = "undefined-condition";
}, error_mt);
return ok, new_err, ...;
end
local function from_stanza(stanza, context)
local error_type, condition, text = stanza:get_error();
return setmetatable({
type = error_type or "cancel";
condition = condition or "undefined-condition";
text = text;
context = context or { stanza = stanza };
}, error_mt);
end
return {
new = new;
coerce = coerce;
is_err = is_err;
from_stanza = from_stanza;
}
|