aboutsummaryrefslogtreecommitdiffstats
path: root/logger.moon
blob: cd41cc84cdbbd3c3b51abcaff19cbd1898f509aa (plain)
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
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
        if level == levels.error or @level == levels.debug
          print @prefix .. first, ...
          print where
        else
          print @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, ...) =>
    result = { xpcall fn, debug.traceback, ... }
    ok = table.remove result, 1

    if not ok
      @error msg, unpack result
      return

    unpack result

-- static
  init: (...) ->
    export L
    L = Logger ...

{
  :Logger
}