util.helpers: show_events(): Make more robust, and allow filtering results to a speci...
[prosody.git] / util / helpers.lua
1 -- Prosody IM
2 -- Copyright (C) 2008-2010 Matthew Wild
3 -- Copyright (C) 2008-2010 Waqas Hussain
4 -- 
5 -- This project is MIT/X11 licensed. Please see the
6 -- COPYING file in the source package for more information.
7 --
8
9 local debug = require "util.debug";
10
11 module("helpers", package.seeall);
12
13 -- Helper functions for debugging
14
15 local log = require "util.logger".init("util.debug");
16
17 function log_events(events, name, logger)
18         local f = events.fire_event;
19         if not f then
20                 error("Object does not appear to be a util.events object");
21         end
22         logger = logger or log;
23         name = name or tostring(events);
24         function events.fire_event(event, ...)
25                 logger("debug", "%s firing event: %s", name, event);
26                 return f(event, ...);
27         end
28         events[events.fire_event] = f;
29         return events;
30 end
31
32 function revert_log_events(events)
33         events.fire_event, events[events.fire_event] = events[events.fire_event], nil; -- :))
34 end
35
36 function show_events(events, specific_event)
37         local event_handlers = events._handlers;
38         local events_array = {};
39         local event_handler_arrays = {};
40         for event in pairs(events._event_map) do
41                 local handlers = event_handlers[event];
42                 if handlers and (event == specific_event or not specific_event) then
43                         table.insert(events_array, event);
44                         local handler_strings = {};
45                         for i, handler in ipairs(handlers) do
46                                 local upvals = debug.string_from_var_table(debug.get_upvalues_table(handler));
47                                 handler_strings[i] = "  "..i..": "..tostring(handler)..(upvals and ("\n        "..upvals) or "");
48                         end
49                         event_handler_arrays[event] = handler_strings;
50                 end
51         end
52         table.sort(events_array);
53         local i = 1;
54         while i <= #events_array do
55                 local handlers = event_handler_arrays[events_array[i]];
56                 for j=#handlers, 1, -1 do
57                         table.insert(events_array, i+1, handlers[j]);
58                 end
59                 if i > 1 then events_array[i] = "\n"..events_array[i]; end
60                 i = i + #handlers + 1
61         end
62         return table.concat(events_array, "\n");
63 end
64
65 function get_upvalue(f, get_name)
66         local i, name, value = 0;
67         repeat
68                 i = i + 1;
69                 name, value = debug.getupvalue(f, i);
70         until name == get_name or name == nil;
71         return value;
72 end
73
74 return _M;