class RbSys::Util::Logger

def add(level, message, emoji: true)

def add(level, message, emoji: true)
  emote, _ = LEVEL_STYLES.fetch(level.to_sym)
  io.puts "::#{level}::#{emote} #{message}"
end

def add(level, message, emoji: true)

def add(level, message, emoji: true)
  emoji_opt, shellcode = LEVEL_STYLES.fetch(level.to_sym)
  emoji_opt = if emoji.is_a?(String)
    emoji + " "
  elsif emoji
    emoji_opt + " "
  end
  # Escape the message for bash shell codes (e.g. \033[1;31m)
  escaped = message.gsub("\\", "\\\\\\").gsub("\033", "\\033")
  io.puts "#{shellcode}#{emoji_opt}#{escaped}\033[0m"
end

def error(message, **opts)

def error(message, **opts)
  add(:error, message, **opts)
end

def fatal(message, **opts)

def fatal(message, **opts)
  error(message, **opts)
  abort
end

def info(message, **opts)

def info(message, **opts)
  add(:info, message, **opts)
end

def initialize(io: $stderr, level: :info)

def initialize(io: $stderr, level: :info)
  @io = ENV["GITHUB_ACTIONS"] ? $stdout : io
  @level = level
end

def notice(message, **opts)

def notice(message, **opts)
  add(:notice, message, **opts)
end

def trace(message, **opts)

def trace(message, **opts)
  return unless level == :trace
  add(:trace, message, **opts)
end

def warn(message, **opts)

def warn(message, **opts)
  add(:warn, message, **opts)
end