Software /
code /
prosody
Comparison
util/error.lua @ 10563:e8db377a2983
Merge 0.11->trunk
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Tue, 24 Dec 2019 00:39:45 +0100 |
parent | 10501:e8186aba1583 |
child | 11050:51be24b16e8a |
comparison
equal
deleted
inserted
replaced
10562:670afc079f68 | 10563:e8db377a2983 |
---|---|
1 local error_mt = { __name = "error" }; | |
2 | |
3 function error_mt:__tostring() | |
4 return ("error<%s:%s:%s>"):format(self.type, self.condition, self.text or ""); | |
5 end | |
6 | |
7 local function is_err(e) | |
8 return getmetatable(e) == error_mt; | |
9 end | |
10 | |
11 -- Do we want any more well-known fields? | |
12 -- Or could we just copy all fields from `e`? | |
13 -- Sometimes you want variable details in the `text`, how to handle that? | |
14 -- Translations? | |
15 -- Should the `type` be restricted to the stanza error types or free-form? | |
16 -- What to set `type` to for stream errors or SASL errors? Those don't have a 'type' attr. | |
17 | |
18 local function new(e, context, registry) | |
19 local template = (registry and registry[e]) or e or {}; | |
20 return setmetatable({ | |
21 type = template.type or "cancel"; | |
22 condition = template.condition or "undefined-condition"; | |
23 text = template.text; | |
24 code = template.code; | |
25 | |
26 context = context or template.context or { _error_id = e }; | |
27 }, error_mt); | |
28 end | |
29 | |
30 local function coerce(ok, err, ...) | |
31 if ok or is_err(err) then | |
32 return ok, err, ...; | |
33 end | |
34 | |
35 local new_err = setmetatable({ | |
36 native = err; | |
37 | |
38 type = "cancel"; | |
39 condition = "undefined-condition"; | |
40 }, error_mt); | |
41 return ok, new_err, ...; | |
42 end | |
43 | |
44 local function from_stanza(stanza, context) | |
45 local error_type, condition, text = stanza:get_error(); | |
46 return setmetatable({ | |
47 type = error_type or "cancel"; | |
48 condition = condition or "undefined-condition"; | |
49 text = text; | |
50 | |
51 context = context or { stanza = stanza }; | |
52 }, error_mt); | |
53 end | |
54 | |
55 return { | |
56 new = new; | |
57 coerce = coerce; | |
58 is_err = is_err; | |
59 from_stanza = from_stanza; | |
60 } |