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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
|
unpack or= table.unpack
class Logger
levels = {
debug: 0
trace: 1
log: 2
warn: 3
error: 4
print: 5
silent: 6
}
mklog = (max_level) ->
new: (level='log') =>
@level = levels[level] or level
@prefix = ' '
for name, level in pairs levels
@[name] = (first, ...) =>
return unless @level <= level
where = debug.traceback '', 2
line = where\match '^.-\n%s+([%w:/%.]+): '
line = (line\match '[%./]*(.*)') or line
line = (line\match '^core/(.*)') or line
line ..= string.rep ' ', 20-#line
if level == levels.error or @level == levels.debug
print "[#{line}]#{@prefix}#{first}", ...
print where
else
print "[#{line}]#{@prefix}#{first}", ...
if level == levels.print
@push = (fn, ...) => fn ...
push: (fn, ...) =>
last = @prefix
@prefix ..= ' '
res = { xpcall fn, debug.traceback, ... }
@prefix = last
if ok = table.remove res, 1
unpack res
else
error unpack res
try: (msg, fn, ...) =>
ok, err = xpcall fn, debug.traceback, ...
if not ok
@error msg, err
if ok then err
-- static
init: (...) ->
export L
L = Logger ...
{
:Logger
}
|