import std/[logging]

type
  QueuedLogMessage* = tuple[lvl: Level, msg: string]

  QueueLogger* = ref object of Logger
    queue: seq[QueuedLogMessage]

proc newQueueLogger*(
  levelThreshold = lvlAll,
  fmtStr = logging.defaultFmtStr): QueueLogger =

  new result
  result.fmtStr = fmtStr
  result.levelThreshold = levelThreshold
  result.queue = newSeq[QueuedLogMessage]()

method log*(logger: QueueLogger, level: Level, args: varargs[string, `$`]) =
  if level >= logger.levelThreshold:
    logger.queue.add((level, substituteLog(logger.fmtStr, level, args)))

proc clearQueue*(logger: QueueLogger) =
  logger.queue = newSeq[QueuedLogMessage]()

func messages*(logger: QueueLogger): seq[QueuedLogMessage] = logger.queue