components_vendor_BrightWebSocket_web_socket_client_Logger.brs

' Logger.brs
' Copyright (C) 2018 Rolando Islas
' Released under the MIT license
'
' Internal logging utility

' Initialize a logging utility
function Logger() as object
  log = {}
  log.FATAL = -2
  log.WARN = -1
  log.INFO = 0
  log.DEBUG = 1
  log.EXTRA = 2
  log.VERBOSE = 3

  ' Main

  ' Log a message
  ' @param level log level string or integer
  ' @param msg message to print
  log.printl = sub(level as object, msg as object)
    if m._parse_level(level) > m.log_level
      return
    end if
    ' bsc-disable-next-line print-locations
    print "[" + m._level_to_string(level) + "] " + msg
  end sub

  ' Parse level to a string
  ' @param level string or integer level
  log._level_to_string = function(level as object) as string
    if type(level) = "roString" or type(level) = "String"
      level = m._parse_level(level)
    end if
    if level = -2
      return "FATAL"
    else if level = -1
      return "WARN"
    else if level = 0
      return "INFO"
    else if level = 1
      return "DEBUG"
    else if level = 2
      return "EXTRA"
    else if level = 3
      return "VERBOSE"
    end if
    ' JellyRock: explicit fallback so every path returns a string (was an implicit invalid return).
    return "?"
  end function

  ' Parse level to an integer
  ' @param level string or integer level
  log._parse_level = function(level as object) as integer
    level_string = level.toStr()
    log_level = 0
    if level_string = "FATAL" or level_string = "-2"
      log_level = m.FATAL
    else if level_string = "WARN" or level_string = "-1"
      log_level = m.WARN
    else if level_string = "INFO" or level_string = "0"
      log_level = m.INFO
    else if level_string = "DEBUG" or level_string = "1"
      log_level = m.DEBUG
    else if level_string = "EXTRA" or level_string = "2"
      log_level = m.EXTRA
    else if level_string = "VERBOSE" or level_string = "3"
      log_level = m.VERBOSE
    end if
    return log_level
  end function

  ' Set the log level
  log.set_log_level = sub(level as string)
    m.log_level = m._parse_level(level)
  end sub

  ' JellyRock modification: default the log level to INFO instead of reading an optional
  ' pkg:/bright_web_socket.json config (JellyRock doesn't ship one — the upstream read
  ' spammed ReadAsciiFile/ParseJSON errors + a WARN on every socket open).
  log.log_level = log.INFO
  return log
end function