util.helpers: Add show_events(), to show the events and handlers in a util.events...
[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)
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                 table.insert(events_array, event);
43                 local handler_strings = {};
44                 for i, handler in ipairs(handlers) do
45                         local upvals = debug.string_from_var_table(debug.get_upvalues_table(handler));
46                         handler_strings[i] = "  "..i..": "..tostring(handler)..(upvals and ("\n        "..upvals) or "");
47                 end
48                 event_handler_arrays[event] = handler_strings;
49         end
50         table.sort(events_array);
51         local i = 1;
52         repeat
53                 local handlers = event_handler_arrays[events_array[i]];
54                 for j=#handlers, 1, -1 do
55                         table.insert(events_array, i+1, handlers[j]);
56                 end
57                 if i > 1 then events_array[i] = "\n"..events_array[i]; end
58                 i = i + #handlers + 1
59         until i == #events_array;
60         return table.concat(events_array, "\n");
61 end
62
63 function get_upvalue(f, get_name)
64         local i, name, value = 0;
65         repeat
66                 i = i + 1;
67                 name, value = debug.getupvalue(f, i);
68         until name == get_name or name == nil;
69         return value;
70 end
71
72 return _M;