aboutsummaryrefslogtreecommitdiffstats
path: root/logger.moon
blob: 97b3c0d204c1ec6aaa4113a836fb62a7c3bf44c6 (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
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
}