# frozen_string_literal: true

autoload :JSON, 'json'

class JsonlFormatter < Asciidoctor::Logger::BasicFormatter
  def call severity, time, progname, msg
    entry = { 'time' => time.utc.to_i, 'level' => severity.downcase, 'name' => progname }
    if ::String === msg
      entry['msg'] = msg
    else
      loc = msg[:source_location]
      entry['file'] = { 'path' => loc.file, 'line' => loc.lineno }
      entry['msg'] = msg[:text]
    end
    (JSON.generate entry) + ?\n
  end
end

proc do
  logger = Asciidoctor::LoggerManager.logger
  logger.formatter = JsonlFormatter.new
  unless (progname = ::File.basename $PROGRAM_NAME).empty?
    logger.progname = progname
  end
end.call
