local Log = require "cave.log" local Meta = require "cave.meta" local Str = Meta.String local validate = Meta.validate local Optional = Meta.Optional ---@class cave.FunctionLogger ---@field fn_repr string local FunctionLogger = Meta.derive "FuncLogger" ---@param fn_name string ---@param args_fmt string? ---@param ... any function FunctionLogger:init(fn_name, args_fmt, ...) local args_repr = (args_fmt and args_fmt:format(...)) or "" self.fn_repr = ("%s(%s)"):format(fn_name, args_repr) end ---@param fn_name string ---@param args_fmt string? ---@param ... any ---@return cave.FunctionLogger function FunctionLogger.new(fn_name, args_fmt, ...) validate { fn_name = { fn_name, Str }, args_fmt = { args_fmt, Optional(Str) } } local logger = setmetatable({}, FunctionLogger) logger:init(fn_name, args_fmt, ...) return logger end ---@return cave.FunctionLogger function FunctionLogger:call() Log.dbg("> %s", self.fn_repr) return self end ---@param err_fmt string? ---@param ... any function FunctionLogger:err(err_fmt, ...) validate { err = { err_fmt, Optional(Str) } } local res_msg = "err" if err_fmt ~= nil then res_msg = res_msg .. " " .. err_fmt:format(...) end Log.err(("< %s - %s"):format(self.fn_repr, res_msg)) end -- ---@param warn_fmt string? ---@param ... any function FunctionLogger:warn(warn_fmt, ...) validate { err = { warn_fmt, Optional(Str) } } local res_msg = "warn" if warn_fmt ~= nil then res_msg = res_msg .. " " .. warn_fmt:format(...) end Log.err(("~ %s - %s"):format(self.fn_repr, res_msg)) end ---@param res_fmt string? ---@param ... any function FunctionLogger:ok(res_fmt, ...) validate { results = { res_fmt, Optional(Str) } } local res_msg = "ok" if res_fmt ~= nil then res_msg = res_msg .. " " .. res_fmt:format(...) end Log.dbg(("< %s - %s"):format(self.fn_repr, res_msg)) end return FunctionLogger