From d44cc2908ac233ef37c1794c4ec6be95d54d4830 Mon Sep 17 00:00:00 2001 From: Erich L Foster Date: Tue, 4 Jun 2024 13:19:01 +0200 Subject: [PATCH] Add logging --- lua/devcontainer-cli/config.lua | 3 + lua/devcontainer-cli/health.lua | 7 +- lua/devcontainer-cli/init.lua | 8 +- lua/devcontainer-cli/log.lua | 156 ++++++++++++++++++++++++++++++++ 4 files changed, 168 insertions(+), 6 deletions(-) create mode 100644 lua/devcontainer-cli/log.lua diff --git a/lua/devcontainer-cli/config.lua b/lua/devcontainer-cli/config.lua index 06d54b5..bfe92cc 100644 --- a/lua/devcontainer-cli/config.lua +++ b/lua/devcontainer-cli/config.lua @@ -17,6 +17,7 @@ -- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -- SOFTWARE. +local log = require("devcontainer_cli.log") local ConfigModule = {} local file_path = debug.getinfo(1).source:sub(2) @@ -54,8 +55,10 @@ local default_config = { local options function ConfigModule.setup(opts) + log.debug("Configuring devcontainer-cli") opts = vim.tbl_deep_extend("force", default_config, opts or {}) options = opts + log.debug("Configuring devcontainer-cli complete") end return setmetatable(ConfigModule, diff --git a/lua/devcontainer-cli/health.lua b/lua/devcontainer-cli/health.lua index 8551047..abb8125 100644 --- a/lua/devcontainer-cli/health.lua +++ b/lua/devcontainer-cli/health.lua @@ -20,10 +20,9 @@ local M = {} -local start = vim.health.start or vim.health.report_start -local ok = vim.health.ok or vim.health.report_ok -local warn = vim.health.warn or vim.health.report_warn -local error = vim.health.error or vim.health.report_error +local start = vim.health.start or vim.health.start +local ok = vim.health.ok or vim.health.ok +local error = vim.health.error or vim.health.error local function verify_binary(binary_name) if vim.fn.executable(binary_name) ~= 1 then diff --git a/lua/devcontainer-cli/init.lua b/lua/devcontainer-cli/init.lua index 702b7fa..ba3e582 100644 --- a/lua/devcontainer-cli/init.lua +++ b/lua/devcontainer-cli/init.lua @@ -22,14 +22,16 @@ local M = {} local devcontainer_cli = require("devcontainer-cli.devcontainer_cli") local config = require("devcontainer-cli.config") +local log = require("devcontainer_cli.log") -- setup the devcontainer-cli plugin ---@param opts (table) the options to set (see config/init.lua) function M.setup(opts) - config.setup(opts) - configured = true + log.debug("Setting up devcontainer-cli") + config.setup(opts) + log.debug("Creating devcontainer-cli user commands") -- Docker vim.api.nvim_create_user_command( "DevcontainerUp", @@ -66,6 +68,8 @@ function M.setup(opts) desc = "Connect to devcontainer.", } ) + + log.debug("Finished setting up devcontainer-cli") end return M diff --git a/lua/devcontainer-cli/log.lua b/lua/devcontainer-cli/log.lua new file mode 100644 index 0000000..fdda1e9 --- /dev/null +++ b/lua/devcontainer-cli/log.lua @@ -0,0 +1,156 @@ +-- log.lua +-- +-- Inspired by rxi/log.lua +-- Modified by tjdevries and can be found at github.com/tjdevries/vlog.nvim +-- +-- This library is free software; you can redistribute it and/or modify it +-- under the terms of the MIT license. See LICENSE for details. + +-- User configuration section +local default_config = { + -- Name of the plugin. Prepended to log messages + plugin = 'decontainer-cli', + + -- Should print the output to neovim while running + use_console = true, + + -- Should highlighting be used in console (using echohl) + highlights = true, + + -- Should write to a file + use_file = true, + + -- Any messages above this level will be logged. + level = "debug", + + -- Level configuration + modes = { + { name = "trace", hl = "Comment", }, + { name = "debug", hl = "Comment", }, + { name = "info", hl = "None", }, + { name = "warn", hl = "WarningMsg", }, + { name = "error", hl = "ErrorMsg", }, + { name = "fatal", hl = "ErrorMsg", }, + }, + + -- Can limit the number of decimals displayed for floats + float_precision = 0.01, +} + +-- {{{ NO NEED TO CHANGE +local log = {} + +local unpack = unpack or table.unpack + +log.new = function(config, standalone) + config = vim.tbl_deep_extend("force", default_config, config) + + local outfile = string.format('%s/%s.log', vim.fn.stdpath("cache"), config.plugin) + + local obj + if standalone then + obj = log + else + obj = {} + end + + local levels = {} + for i, v in ipairs(config.modes) do + levels[v.name] = i + end + + local round = function(x, increment) + increment = increment or 1 + x = x / increment + return (x > 0 and math.floor(x + .5) or math.ceil(x - .5)) * increment + end + + local make_string = function(...) + local t = {} + for i = 1, select('#', ...) do + local x = select(i, ...) + + if type(x) == "number" and config.float_precision then + x = tostring(round(x, config.float_precision)) + elseif type(x) == "table" then + x = vim.inspect(x) + else + x = tostring(x) + end + + t[#t + 1] = x + end + return table.concat(t, " ") + end + + + local log_at_level = function(level, level_config, message_maker, ...) + -- Return early if we're below the config.level + if level < levels[config.level] then + return + end + local nameupper = level_config.name:upper() + + local msg = message_maker(...) + local info = debug.getinfo(2, "Sl") + local lineinfo = info.short_src .. ":" .. info.currentline + + -- Output to console + if config.use_console then + local console_string = string.format( + "[%-6s%s] %s: %s", + nameupper, + os.date("%H:%M:%S"), + lineinfo, + msg + ) + + if config.highlights and level_config.hl then + vim.cmd(string.format("echohl %s", level_config.hl)) + end + + local split_console = vim.split(console_string, "\n") + for _, v in ipairs(split_console) do + vim.cmd(string.format([[echom "[%s] %s"]], config.plugin, vim.fn.escape(v, '"'))) + end + + if config.highlights and level_config.hl then + vim.cmd("echohl NONE") + end + end + + -- Output to log file + if config.use_file then + local fp = io.open(outfile, "a") + local str = string.format("[%-6s%s] %s: %s\n", + nameupper, os.date(), lineinfo, msg) + if fp ~= nil then + fp:write(str) + fp:close() + end + end + end + + for i, x in ipairs(config.modes) do + obj[x.name] = function(...) + return log_at_level(i, x, make_string, ...) + end + + obj[("fmt_%s" ):format(x.name)] = function() + return log_at_level(i, x, function(...) + local passed = {...} + local fmt = table.remove(passed, 1) + local inspected = {} + for _, v in ipairs(passed) do + table.insert(inspected, vim.inspect(v)) + end + return string.format(fmt, unpack(inspected)) + end) + end + end +end + +log.new(default_config, true) +-- }}} + +return log