make patterns runtime only
This commit is contained in:
parent
93a9fd203a
commit
116051208a
|
@ -7,64 +7,71 @@
|
||||||
## This file may not be copied, modified, or distributed except according to
|
## This file may not be copied, modified, or distributed except according to
|
||||||
## those terms.
|
## those terms.
|
||||||
|
|
||||||
## Small debug module that's enabled through a ``-d:debugout``
|
## Small debug module that's only runs in non release builds.
|
||||||
## flag. It's inspired by the Nodejs ``debug`` module that
|
## It's inspired by the Nodejs ``debug`` module which allows printing
|
||||||
## allows printing colorized output based on patterns. This
|
## colorized output based on matched patterns. This module is powered
|
||||||
## module is powered by the standard ``nre`` module and as such
|
## by the standard ``nre`` module and as such it supports the same set
|
||||||
## it supports the same set of regexp expressions.
|
## of regexp expressions.
|
||||||
|
##
|
||||||
|
## The output is controled through two environment variables ``DEBUG``
|
||||||
|
## and ``DEBUG_COLOR``. By default, it will print everything to stderr
|
||||||
|
## but if only some output is of interested, ``DEBUG`` accepts a coma
|
||||||
|
## separated list of regexp expressions to match the output against.
|
||||||
|
## Each match gets assigned a different color to help differentiate
|
||||||
|
## the output lines.
|
||||||
|
##
|
||||||
|
## Colorization is done with 256 ANSI colors, and each run gets a random
|
||||||
|
## color, if more than one match is specified, each one gets a random color
|
||||||
|
## to disable this behavior use ``DEBUG_COLOR`` with a valid ANSI color code.
|
||||||
|
## This will also disable individual colorization for each matched line.
|
||||||
##
|
##
|
||||||
## To enable debug output, pass the ``debugout`` flag during build
|
|
||||||
## time with ``-d`` flag. In addition, the debugout flag takes a comma
|
|
||||||
## separated list of patters that will narow the debug output to
|
|
||||||
## only those matched by the patterns. By default however, all
|
|
||||||
## debug statements are outputed to the stderr.
|
|
||||||
|
|
||||||
when defined(debugout) and not defined(release):
|
when not defined(release):
|
||||||
import random,
|
import random,
|
||||||
tables,
|
tables,
|
||||||
nre,
|
nre,
|
||||||
strutils,
|
strutils,
|
||||||
times,
|
times,
|
||||||
terminal,
|
terminal,
|
||||||
sequtils
|
sequtils,
|
||||||
|
os
|
||||||
const debugout {.strdefine.}: string = ".*"
|
|
||||||
|
|
||||||
type
|
type
|
||||||
Match = object
|
Match = object
|
||||||
pattern: Regex
|
pattern: Regex
|
||||||
color: string
|
color: string
|
||||||
|
|
||||||
if isTrueColorSupported():
|
# if isTrueColorSupported():
|
||||||
system.addQuitProc(resetAttributes)
|
# system.addQuitProc(resetAttributes)
|
||||||
enableTrueColors()
|
# enableTrueColors()
|
||||||
|
|
||||||
var context {.threadvar.} : OrderedTableRef[string, Match]
|
var context {.threadvar.} : OrderedTableRef[string, Match]
|
||||||
proc initDebugCtx() =
|
proc initDebugCtx() =
|
||||||
|
let debugout = getEnv("DEBUG", ".*")
|
||||||
|
let debugColor = getEnv("DEBUG_COLOR")
|
||||||
|
let isDebugColor = debugColor.len > 0
|
||||||
context = newOrderedTable[string, Match]()
|
context = newOrderedTable[string, Match]()
|
||||||
var patrns = @[".*"]
|
var patrns: seq[string] = @[]
|
||||||
if debugout != "true":
|
|
||||||
patrns = debugout.split(re"[,\s]").filterIt(it.len > 0)
|
patrns = debugout.split(re"[,\s]").filterIt(it.len > 0)
|
||||||
|
|
||||||
randomize()
|
randomize()
|
||||||
for p in patrns:
|
for p in patrns:
|
||||||
context[p] = Match(pattern: re(p), color: $rand(0..272)) # 256 ansi colors
|
context[p] = Match(pattern: re(p), color: if isDebugColor: debugColor else: $rand(0..272)) # 256 ansi colors
|
||||||
|
|
||||||
proc doDebug(data: string): void {.gcsafe.} =
|
proc doDebug(data: string, line: string): void {.gcsafe.} =
|
||||||
if isNil(context):
|
if isNil(context):
|
||||||
initDebugCtx()
|
initDebugCtx()
|
||||||
for m in context.values:
|
for m in context.values:
|
||||||
if data.match(m.pattern).isSome:
|
if data.contains(m.pattern):
|
||||||
stderr.writeLine("\u001b[38;5;" & m.color & "m " & alignLeft(data, 4) & "\e[0m")
|
stderr.writeLine("\u001b[38;5;" & m.color & "m " & alignLeft(line & data, 4) & "\e[0m")
|
||||||
return
|
return
|
||||||
|
|
||||||
template debug*(data: string) =
|
template debug*(data: string) =
|
||||||
let module = instantiationInfo()
|
let module = instantiationInfo()
|
||||||
let line = "$# $#:$# - $#" %
|
let line = "$# $#:$# - " %
|
||||||
[now().format("yyyy-MM-dd HH:mm:ss:fffffffff"),
|
[now().format("yyyy-MM-dd HH:mm:ss:fffffffff"),
|
||||||
module.filename[0..^5],
|
module.filename[0..^5],
|
||||||
$module.line,
|
$module.line]
|
||||||
data]
|
doDebug(data, line)
|
||||||
doDebug(line)
|
|
||||||
else:
|
else:
|
||||||
template debug*(data: string) = discard
|
template debug*(data: string) = discard
|
Loading…
Reference in New Issue