Files
dotfiles/wezterm/.config/utils/class/logger.lua
2025-04-08 15:31:34 -04:00

148 lines
4.8 KiB
Lua

---@module "utils.class.logger"
---@author sravioli
---@license GNU-GPLv3
local wt = require "wezterm"
---@diagnostic disable-next-line: undefined-field
local G, log_info, log_warn, log_error = wt.GLOBAL, wt.log_info, wt.log_warn, wt.log_error
-- selene: allow(incorrect_standard_library_use)
local unpack = unpack or table.unpack
local inspect = require("utils.external.inspect").inspect
local levels = { DEBUG = 0, INFO = 1, WARN = 2, ERROR = 3 }
-- {{{1 Helpers
local h = {}
---Converts each given vararg to a string
---@param ... any
---@return ... string
h.stringify = function(...)
local args = { ... }
for i = 1, #args do
if type(args[i]) == "userdata" then
args[i] = tostring(args[i])
else
args[i] = inspect(args[i])
end
end
return unpack(args)
end
---Returns the appropriate log level
---@param level string|integer
---@return integer level log level converted to integer
h.get_level = function(level)
if type(level) == "string" then
level = levels[level:upper()]
end
return level
end
-- }}}
---@class Utils.Class.Logger
---@field identifier string
---@field enabled boolean
---@field log_level integer
local M = {}
M.__index = M
---Creates a new class instance
---
---Whether logging is enabled is globally controlled by the `wezterm.GLOBAL.enable_logging`
---variable. Setting it to `false` (either from the Debug overlay or from the configuration),
---will disable logging; the opposite happens when it is set to `true`.
---
---@param identifier? string indentifier that will be printed in brackets before the msg
---@param enabled? boolean whether to enable logging or not. defaults to true at warn lvl
---@return Utils.Class.Logger
function M:new(identifier, enabled)
return setmetatable({
identifier = identifier or "Logger",
enabled = G.enable_logging or enabled or true,
log_level = h.get_level(G.log_level or levels.WARN),
}, self)
end
---Logs a message with the specified log level
---
---Logs the given string to the Wezterm's debug overlay. The message can be either a
---simple string or a format string. The latter must only use `%s` placeholders since the
---function already takes care of stringifing any non-string value.
---
---@param level integer|string log level
---@param message string log message or format string
---@param ... any additional arguments to format into the message
function M:log(level, message, ...)
if not (G.enable_logging and self.enabled) then
return
end
if h.get_level(level) < self.log_level then
return
end
local msg = ("[%s] %s"):format(self.identifier, message:format(h.stringify(...)))
if (level == levels.DEBUG) or (level == levels.INFO) then
log_info(msg)
elseif level == levels.WARN then
log_warn(msg)
elseif level == levels.ERROR then
log_error(msg)
else
self:error("invalid log level: %s", level)
end
end
---Logs a debug level message to the Wezterm's debug overlay.
---
---Logs the given string to the Wezterm's debug overlay. The message can be either a
---simple string or a format string. The latter must only use `%s` placeholders since the
---function already takes care of stringifing any non-string value.
---
---@param message string log message or format string
---@param ... any additional arguments to format into the message
function M:debug(message, ...)
self:log(levels.DEBUG, "DEBUG: " .. message, ...)
end
---Logs a info level message to the Wezterm's debug overlay.
---
---Logs the given string to the Wezterm's debug overlay. The message can be either a
---simple string or a format string. The latter must only use `%s` placeholders since the
---function already takes care of stringifing any non-string value.
---
---@param message string log message or format string
---@param ... any additional arguments to format into the message
function M:info(message, ...)
self:log(levels.INFO, message, ...)
end
---Logs a warn level message to the Wezterm's debug overlay.
---
---Logs the given string to the Wezterm's debug overlay. The message can be either a
---simple string or a format string. The latter must only use `%s` placeholders since the
---function already takes care of stringifing any non-string value.
---
---@param message string log message or format string
---@param ... any additional arguments to format into the message
function M:warn(message, ...)
self:log(levels.WARN, message, ...)
end
---Logs an error level message to the Wezterm's debug overlay.
---
---Logs the given string to the Wezterm's debug overlay. The message can be either a
---simple string or a format string. The latter must only use `%s` placeholders since the
---function already takes care of stringifing any non-string value.
---
---@param message string log message or format string
---@param ... any additional arguments to format into the message
function M:error(message, ...)
self:log(levels.ERROR, message, ...)
end
return M