From 2a169da3afd8bb94eff10fe26eea830c9603f648 Mon Sep 17 00:00:00 2001 From: Insality Date: Mon, 27 Oct 2025 22:25:37 +0200 Subject: [PATCH] Add Druid logger --- druid/druid.lua | 22 ++++++++++++++++++++ druid/helper.lua | 38 ++++++++++++++++++++++++++-------- druid/system/druid_logger.lua | 39 +++++++++++++++++++++++++++++++++++ 3 files changed, 90 insertions(+), 9 deletions(-) create mode 100644 druid/system/druid_logger.lua diff --git a/druid/druid.lua b/druid/druid.lua index 1fcf995..3e9aba7 100644 --- a/druid/druid.lua +++ b/druid/druid.lua @@ -2,6 +2,7 @@ local event = require("event.event") local events = require("event.events") local settings = require("druid.system.settings") local druid_instance = require("druid.system.druid_instance") +local logger = require("druid.system.druid_logger") local default_style = require("druid.styles.default.style") @@ -193,4 +194,25 @@ function M.unregister_druid_as_widget() end +---@param logger_instance druid.logger|table|nil +function M.set_logger(logger_instance) + logger.set_logger(logger_instance) +end + + +---@param name string? +---@param level string|nil +---@return druid.logger +function M.get_logger(name, level) + if not name then + local current_script_path = debug.getinfo(3).short_src + local basename = string.match(current_script_path, "([^/\\]+)$") + basename = string.match(basename, "(.*)%..*$") + name = basename + end + + return setmetatable({ name = name, level = level }, { __index = logger }) +end + + return M diff --git a/druid/helper.lua b/druid/helper.lua index bb43d0c..4892a08 100644 --- a/druid/helper.lua +++ b/druid/helper.lua @@ -404,24 +404,44 @@ function M.is_multitouch_supported() end ----Simple table to one-line string converter +---Converts table to one-line string ---@param t table ----@return string -function M.table_to_string(t) - if not t then - return "" +---@param depth number? +---@param result string|nil Internal parameter +---@return string, boolean result String representation of table, Is max string length reached +function M.table_to_string(t, depth, result) + if type(t) ~= "table" then + return tostring(t) or "", false end - local result = "{" + depth = depth or 0 + result = result or "{" for key, value in pairs(t) do if #result > 1 then - result = result .. "," + result = result .. ", " + end + + if type(value) == "table" then + if depth == 0 then + local table_len = 0 + for _ in pairs(value) do + table_len = table_len + 1 + end + result = result .. key .. ": {... #" .. table_len .. "}" + else + local convert_result, is_limit = M.table_to_string(value, depth - 1, "") + result = result .. key .. ": {" .. convert_result + if is_limit then + break + end + end + else + result = result .. key .. ": " .. tostring(value) end - result = result .. key .. ": " .. value end - return result .. "}" + return result .. "}", false end diff --git a/druid/system/druid_logger.lua b/druid/system/druid_logger.lua new file mode 100644 index 0000000..74a0d46 --- /dev/null +++ b/druid/system/druid_logger.lua @@ -0,0 +1,39 @@ +local helper = require("druid.helper") + +---@class druid.logger +---@field trace fun(_, msg: string, data: any) +---@field debug fun(_, msg: string, data: any) +---@field info fun(_, msg: string, data: any) +---@field warn fun(_, msg: string, data: any) +---@field error fun(_, msg: string, data: any) +local M = {} + +local EMPTY_FUNCTION = function(_, message, context) end + +---@type druid.logger +local empty_logger = { + trace = EMPTY_FUNCTION, + debug = EMPTY_FUNCTION, + info = EMPTY_FUNCTION, + warn = EMPTY_FUNCTION, + error = EMPTY_FUNCTION, +} + +---@type druid.logger +local default_logger = { + trace = function(_, msg, data) print("TRACE: " .. msg, helper.table_to_string(data)) end, + debug = function(_, msg, data) print("DEBUG: " .. msg, helper.table_to_string(data)) end, + info = function(_, msg, data) print("INFO: " .. msg, helper.table_to_string(data)) end, + warn = function(_, msg, data) print("WARN: " .. msg, helper.table_to_string(data)) end, + error = function(_, msg, data) print("ERROR: " .. msg, helper.table_to_string(data)) end +} + +local METATABLE = { __index = default_logger } + +---@param logger druid.logger|table|nil +function M.set_logger(logger) + METATABLE.__index = logger or empty_logger +end + + +return setmetatable(M, METATABLE)